我有一个包含150万个文档的RAMDirectory,我正在使用PrefixQuery搜索单个字段。当搜索文本的长度为3个或更多字符时,搜索速度非常快,小于20毫秒。但是当搜索文本的长度小于3个字符时,搜索可能需要整整1秒。
由于它是一个自动完成功能,并且用户以一个字符开头(并且结果确实是1个字符长度),因此我无法限制搜索文本的长度。
代码非常多:
var symbolCodeTopDocs = searcher.Search(new PrefixQuery(new Term("SymbolCode", searchText), 10);
SymbolCode是NOT_ANALYZED字段。 Lucene.NET版本是3.0.3。
示例已经过简化,我可能不得不使用BooleanQuery在现实场景中应用其他约束。
如何提高此特定案例的表现?这些单字符或双字符查询会降低服务器的速度。
答案 0 :(得分:2)
如果你还没有,请考虑从索引中删除停用词。
要理解停止词如何减慢PrefixQuery,然后考虑PrefixQuery如何工作:它被重写为一个BooleanQuery,其中包含从PrefixQuery术语开始的索引中的每个术语。例如a*
变为a OR and OR aardvark OR anchor OR ...
到目前为止,这还不错,即使有数千个术语,它也会表现出色。真正的消耗是当包括a
和and
这样的停用词时,因为它们很可能会在索引中的每个文档中多次找到。这为搜索的收集/收集/评分部分创造了更多的工作,从而减慢了速度。
在旁注中,我强烈建议不运行自动完成搜索,当用户输入少于2或3个字符时,纯粹从可用性角度来看。我无法想象结果将是完全相关的。想象一下,搜索a*
- 无法确定哪些结果更相关。如果您必须向用户显示某些内容,请考虑在评论中建议使用像Jf Beaulac这样的n-gram方法。