首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用Lucene进行业务应用程序搜索吗?

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

Stack Overflow用户
提问于 2009-09-13 03:18:48
回答 2查看 384关注 0票数 2

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

一种选择是进行表查询,例如"select * from salespersons name包含'searchtest'“或类似的查询。但是我想知道我是否可以使用Lucene(.net)来代替它。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-13 04:39:59

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

  • 以增量方式索引表。每一行都有一个时间戳(上次修改)。每隔5分钟,cron作业就会启动一个java进程,该进程读取自上次运行以来修改过的行,创建它们的纯文本版本,然后更新lucene索引。增量索引将锁定大约1000个表行的200-300个msces的表。显然,这取决于你的系统、数据库模式等。然而,我的经验是,实现这一点绝对是实用的。使用lucene的搜索操作比使用查询的搜索操作快几个数量级,
  • 使用专用的线程进行索引。每当数据库中发生变化时,实际运行SQL查询的代码应该(通过LinkedBlockinQueue)向更新lucene索引的线程发送一条消息。这样,您在主线程处的updateDB()方法在DB更新后立即返回,而不必等待lucene索引过程,而索引尽可能快地发生(通常在几毫秒之后)。这样做的一个缺点是lucene使用存储在磁盘中的锁。因此,我假设为每一行更新索引都会产生开销(虽然我没有运行任何基准测试)。一种解决方法是在索引线程上保留一个更新缓冲区,并每隔几秒钟将它们刷新到磁盘上(同样,这种方法的性能取决于索引上的更新与搜索的比率)
票数 2
EN

Stack Overflow用户

发布于 2009-09-13 03:39:17

是的,你当然可以在这个用例中使用Lucene。我看到了一些缺点:

近实时搜索您将复制索引中的许多信息(并且您必须实现一些东西来保持索引和数据库的同步,这可能不是trivial.)

  • You'll频繁地访问数据库(或者延迟插入,或者只是创建更多的负载,这取决于您选择的构建方式)。

还有一个(很大的)好处:

  • Lucene很可能在性能和结果质量两方面优于数据库全文索引。

这个问题的答案可能会对Lucene.Net Best Practices有所帮助

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1416759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档