Lucene 搜索性能 - DOC 与 DEFAULT 排序
Lucene search performance - DOC vs DEFAULT sorting
我们已经 运行 使用 Lucene.Net 3.0.3 在搜索和插入方面进行了一些测试。
对于测试,我们使用了关键字分析器和基于真实英语单词的文本生成器。
当索引达到大约 800 万个文档时,同时搜索 1000 个 运行dom 句子,搜索需要 25 分钟才能完成。 (默认排序)
如果我们将搜索更改为文档排序:
searcher.Search(query, null, int.MaxValue, new Sort(new SortField(null, SortField.DOC, true))); // boolean query
搜索只需几秒钟即可完成。
什么给了?
默认排序是基于相关性的吗?为什么会产生这么大的影响?
此外,如果我们将点击次数从 int.MaxValue 减少到比方说 50 次,它也会将搜索时间缩短到只有几秒钟。
是否只采用它在索引中找到的前 50 个匹配项而忽略其余部分?
我相信你的猜测是正确的,如果你按 doc id 顺序排序,它不需要对每个匹配的文档进行评分,而是可以在找到足够多的匹配文档后短路,而不是对排序进行评分每个文档都需要评分才能知道哪些是最佳匹配。
不过,您似乎应该问的问题是,为什么搜索要花这么长时间?
根据您所写的内容,我想我可以猜到:您应该不使用 KeywordAnalyzer 获取全文。听起来您正在将全文索引为关键字,然后搜索句子,可能使用双通配符或正则表达式或类似的东西。 别再那样做了。 您还不如忘记 Lucene,编写一个良好的老式顺序搜索代码,因为无论如何这就是您强迫 Lucene 做的事情。使用真正满足您的搜索需求的分析器(StandardAnalyzer
或 EnglishAnalyzer
是很好的起点),并使用短语查询来搜索短语或句子。
我们已经 运行 使用 Lucene.Net 3.0.3 在搜索和插入方面进行了一些测试。
对于测试,我们使用了关键字分析器和基于真实英语单词的文本生成器。
当索引达到大约 800 万个文档时,同时搜索 1000 个 运行dom 句子,搜索需要 25 分钟才能完成。 (默认排序)
如果我们将搜索更改为文档排序:
searcher.Search(query, null, int.MaxValue, new Sort(new SortField(null, SortField.DOC, true))); // boolean query
搜索只需几秒钟即可完成。
什么给了? 默认排序是基于相关性的吗?为什么会产生这么大的影响?
此外,如果我们将点击次数从 int.MaxValue 减少到比方说 50 次,它也会将搜索时间缩短到只有几秒钟。
是否只采用它在索引中找到的前 50 个匹配项而忽略其余部分?
我相信你的猜测是正确的,如果你按 doc id 顺序排序,它不需要对每个匹配的文档进行评分,而是可以在找到足够多的匹配文档后短路,而不是对排序进行评分每个文档都需要评分才能知道哪些是最佳匹配。
不过,您似乎应该问的问题是,为什么搜索要花这么长时间?
根据您所写的内容,我想我可以猜到:您应该不使用 KeywordAnalyzer 获取全文。听起来您正在将全文索引为关键字,然后搜索句子,可能使用双通配符或正则表达式或类似的东西。 别再那样做了。 您还不如忘记 Lucene,编写一个良好的老式顺序搜索代码,因为无论如何这就是您强迫 Lucene 做的事情。使用真正满足您的搜索需求的分析器(StandardAnalyzer
或 EnglishAnalyzer
是很好的起点),并使用短语查询来搜索短语或句子。