Java 我可以使用Lucene进行业务应用程序搜索吗?

Java 我可以使用Lucene进行业务应用程序搜索吗?,java,.net,search,full-text-search,lucene,Java,.net,Search,Full Text Search,Lucene,我正在开发一个典型的企业/业务应用程序,其中包括订单、销售人员、联系人、参考数据等。。。一次系统上至少有100个或更多用户正在输入新数据、更改数据等。我需要在整个应用程序中为几乎所有表提供搜索功能 一个选项是执行表查询,例如“从名称中包含“searchtest”的Salespers中选择*”或类似操作。但是我想知道我是否可以用Lucene(.net)来代替它 最重要的是,搜索需要在几秒钟内反映出变化。因此,如果用户输入一个订单,然后立即搜索它,那么它需要显示在搜索列表中。(也就是说,我不能每小时

我正在开发一个典型的企业/业务应用程序,其中包括订单、销售人员、联系人、参考数据等。。。一次系统上至少有100个或更多用户正在输入新数据、更改数据等。我需要在整个应用程序中为几乎所有表提供搜索功能

一个选项是执行表查询,例如“从名称中包含“searchtest”的Salespers中选择*”或类似操作。但是我想知道我是否可以用Lucene(.net)来代替它

最重要的是,搜索需要在几秒钟内反映出变化。因此,如果用户输入一个订单,然后立即搜索它,那么它需要显示在搜索列表中。(也就是说,我不能每小时、半小时或每晚都做索引工作)


这是一个很好的选择,还是有更好的选择?

是的,您当然可以在这个用例中使用Lucene。我看到了一些不利因素:

  • 您将复制索引中的大部分信息(并且您必须实现一些东西来保持索引和数据库同步,这可能不是一件小事)
  • 您将经常访问数据库(或者延迟插入或只是创建更多负载,具体取决于您选择的构建方式)来构建此索引
  • 近实时搜索仅在中实现。我不知道Lucene.net在这方面的地位
还有一个(很大的)好处:

  • Lucene很有可能在数据库全文索引的性能和结果质量方面都表现出色

这个问题的答案可能会有所帮助

我实现了一些与您描述的几乎相同的东西。要索引的表非常庞大(使用lucene索引超过5小时),要求搜索在5分钟内反映数据库中的变化。我考虑了两种方法(我实现了第一种):

  • 以增量方式索引表。每一行都有一个时间戳(上次修改)。cron作业每5分钟启动一个java进程,读取自上次运行以来修改的行,创建它们的纯文本版本,然后更新lucene索引。增量索引 将为大约1000个表行锁定200-300 MSCE的表。显然,这取决于您的系统、数据库模式等。然而,根据我的经验,实现这一点绝对是可行的。lucene的搜索操作比查询快几个数量级

  • 使用专用线程进行索引。每当数据库中发生变化时,实际运行SQL查询的代码应该(通过LinkedBlockinQueue)向更新lucene索引的线程发送一条消息。这样,主线程上的updateDB()方法会在数据库更新后立即返回,而不必等待lucene索引过程,而索引会尽快进行(通常几毫秒后)。这样做的一个缺点是lucene使用存储在磁盘中的锁。因此,我假设为每一行更新索引会有开销(不过我还没有运行任何基准测试)。一种解决方法是在索引线程上保留一个更新缓冲区,并每隔几秒钟将其刷新到磁盘上(同样,这取决于索引上的更新与搜索的比率)