【问题标题】:Handling large search queries on relatively small index documents in Lucene在 Lucene 中处理相对较小的索引文档的大型搜索查询
【发布时间】:2013-06-20 17:06:59
【问题描述】:

我正在开展一个项目,我们为相对较小的文档/句子编制索引,并且我们希望使用大型文档作为查询来搜索这些索引。这是一个相对简单的例子: 我正在索引文档:

docId : 1
text: "back to black"

我想使用以下输入进行查询:

"Released on 25 July 1980, Back in Black was the first AC/DC album recorded without former lead singer Bon Scott, who died on 19 February at the age of 33, and was dedicated to him."

Lucene 中最好的方法是什么?对于简单的例子,我想找到的文本是 exactly 输入查询,我使用自己的分析器 + PhraseQuery 比使用 QueryParser.parse(QueryParser.escape(.. .my large input...)) - 最终创建了一个大的布尔/术语查询。

但我不能尝试将 PhraseQuery 方法用于现实世界的示例,我认为我必须使用像 ShingleAnalyzerWrapper 这样的单词 N-Gram 方法,但由于我的输入文档可能非常大,组合数学将变得难以处理...

换句话说,我被困住了,任何想法都将不胜感激:)

附:我没有提到它,但是索引小文档的一个恼人的事情是,由于“规范”值(浮点数)仅在 1 个字节上编码,所有 3-4 个单词的句子都得到相同的规范值,所以搜索像“A B C”这样的句子使结果“A B C”和“A B C D”显示为相同的分数。

谢谢!

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    我不知道你有多少个句子,但你可能想解决这个问题:将你的句子存储为查询,在 transient in-memory index 中索引传入的文档,并在其上运行所有查询以找到匹配的。

    (注意:这就是 Elasticsearch 的 percolator 的工作原理。)

    编辑(2013-06-21)

    如果您有大量的句子,最好将句子存储在索引中。但是,您可以尝试使用 Lucene 的 ShingleFilter 来索引,而不是使用短语查询。在查询时,您手动构建查询而不是使用 QueryParser 的方法是一个不错的方法,但是如果您索引 shingles,您可以构建一个纯布尔查询,其中每个子句匹配一个 shingle 而不是短语查询。

    【讨论】:

    • 是的,我想过,但我有超过 200k 的句子要匹配,我的第一次测试(不使用内存索引)非常慢。但也许这是正确的方法,我会检查 elasticsearch 是如何做到的 :),你认为我不能通过正确的查询使其以其他方式工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多