fsm*_*fsm 9 lucene indexing performance
我正在尝试使用非常不稳定的索引数据源(论坛,社交网络等)来构建索引/搜索应用程序的原型,这里有一些性能要求,
非常快的周转时间(我的意思是,很快就会在搜索结果中显示任何新数据(例如论坛上的新消息)(不到一分钟))
我需要定期丢弃旧文档,以确保搜索结果没有过时.
最后但同样重要的是,搜索应用程序需要响应.(延迟大约100毫秒,并且应该支持至少10 qps)
所有的我都可以当前/可满足W 0使用Lucene的要求(这将让我满足所有1,2和3)在未来,但我期待其他要求(如搜索相关性等)和Lucene的让我们很容易实行.但是,由于Lucene的设计用于比我目前正在进行的工作复杂得多的用例,因此我很难满足我的性能要求.
这是一些问题,
一个.我读到IndexWriter类中的optimize()方法很昂贵,不应该被频繁更新的应用程序使用,有哪些替代方案?
湾 为了进行增量更新,我需要不断提交新数据,并不断刷新索引阅读器以确保它具有新数据.这些将影响上面的1和3.我应该尝试重复索引吗?解决这个问题的常用方法有哪些?
C.我知道Lucene提供了一个删除方法,它允许你删除所有匹配某个查询的文档,在我的情况下,我需要删除所有早于某个年龄的文档,现在一个选项是为每个文件添加一个日期字段记录并使用它来删除文档.是否可以对文档ID进行范围查询(我可以创建自己的id字段,因为我认为由lucene创建的字段不断变化)来删除文档?它比比较表示为字符串的日期更快吗?
我知道这些是非常开放的问题,所以我不是在寻找详细的答案,我会尽力将你的所有答案视为建议并用它们来告知我的设计.谢谢!如果您需要任何其他信息,请与我们联系.
Lucene现在支持近实时搜索.从本质上讲,每次进行搜索时,都会从IndexWriter获得一个Reader.在达到RAM缓冲区大小或commit在writer上调用explicit时,内存中的更改不会进入磁盘.由于通过跳过避免了磁盘IO commit,即使使用新数据,搜索也会快速返回.
Lucene的NRT的一个问题是索引对数合并算法.将10个文档添加到段后触发合并.接下来,合并这样的10个片段以创建具有100个文档的片段,依此类推.现在,如果您有999,999个文档,并且触发了合并,则返回将需要相当长的时间,从而打破您的"实时"承诺.
LinkedIn发布了Zoie,一个位于Lucene之上的图书馆,解决了这个问题.这是生产中的每天处理数百万次更新和搜索的生产.
大多数情况下,Lucene将支持您的所有要求,因为您丢弃旧的更新并且移动窗口大致保持不变.如果没有,你可能需要尝试在战场上证明的Zoie.
A:我认为对于最新版本的Lucene,优化方法并不是真正需要的,并且根据我对C项的建议,它确实不需要。
B:再说一次,我认为使用最新版本的 Lucene,搜索者会知道更新何时完成,并且可以处理它,而不需要做任何特殊的事情。
C:我会避免删除,只是每天创建一个新索引。如果将文档的年龄存储在索引中,则可以使用现有索引来创建新索引。在索引编写过程中,获取所有新文档,遍历它们并将它们添加到新索引中。有一个名为 getCurrentIndex 的公共 util 方法,搜索者使用该方法来获取最新的实时索引。保留 1 或 2 个旧索引以防万一,您就可以开始使用了。