5

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

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

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

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

PS我没有提到它,但索引小文档的一个烦人的事情是,由于“规范”值(浮点数)仅在 1 个字节上编码,所有 3-4 个单词的句子都得到相同的规范值,所以搜索诸如“AB C”之类的句子会使结果“AB C”和“ABC D”以相同的分数显示。

谢谢 !

4

1 回答 1

2

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

(注意:这就是 Elasticsearch 的渗滤器的工作原理。)

编辑(2013-06-21)

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

于 2013-06-20T21:08:53.793 回答