【问题标题】:Lucene search performance - DOC vs DEFAULT sortingLucene 搜索性能 - DOC 与 DEFAULT 排序
【发布时间】:2016-04-18 15:50:08
【问题描述】:

我们在搜索和插入方面使用 Lucene.Net 3.0.3 进行了一些测试。

在测试中,我们使用了基于真实英语单词的关键字分析器和文本生成器。

当索引达到大约 800 万个文档时,在搜索 1000 个随机句子时,搜索需要 25 分钟才能完成。 (默认排序)

如果我们将搜索更改为文档排序:

searcher.Search(query, null, int.MaxValue, new Sort(new SortField(null, SortField.DOC, true))); // boolean query

搜索只需几秒钟即可完成。

什么给了? 是基于相关性的默认排序吗?为什么会产生如此巨大的影响?

此外,如果我们将点击次数从 int.MaxValue 减少到 50 次,它也会将搜索时间减少到几秒钟。

是否只选取它在索引中找到的前 50 个命中而忽略其余的?

【问题讨论】:

    标签: sorting lucene performance-testing lucene.net


    【解决方案1】:

    我相信您的猜测是正确的,如果您按 doc id 顺序排序,则不需要对每个匹配的文档进行评分,而是在找到足够的匹配文档后会短路,而不是对每个文档进行评分排序需要打分才能知道哪些是最佳匹配。

    不过,您似乎应该问的问题是,为什么搜索要花这么长时间?

    根据您所写的内容,我想我可以猜到:您应该将 KeywordAnalyzer 用于全文。听起来您将全文索引为关键字,然后搜索句子,可能使用双通配符或正则表达式或类似的东西。 别再这样了。你还不如忘记 Lucene,编写一个很好的老式顺序搜索,因为这就是你强迫 Lucene 做的事情。使用真正满足您搜索需求的分析器(StandardAnalyzerEnglishAnalyzer 是很好的起点),并使用短语查询来搜索短语或句子。

    【讨论】:

    • 在这种特定情况下,我在一个字段中使用关键字分析器和另一个字段中的标准分析器来索引全文。当传入的搜索必须 100% 准确时,我会搜索关键字分析器索引的特定字段。您将如何处理此案?
    • @pelican_george - 100% 准确是什么意思?如果您的意思是查询必须匹配字段的整个文本,那么关键字分析是合适的。如果您的意思是查询必须与字段的一部分完全匹配(也就是说,如果您必须在当前查询中使用通配符),那么我首先会想到 PhraseQuery。其他分析方法也可能有用。
    • 我的意思是查询必须匹配该字段的整个文本。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多