在Lucene中处理相对较小的索引文档上的大型搜索查询

Oli*_*dot 5 java lucene

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

docId : 1
text: "back to black"
Run Code Online (Sandbox Code Playgroud)

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

"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."
Run Code Online (Sandbox Code Playgroud)

Lucene最好的方法是什么?对于简单的示例,我想要查找的文本正是输入查询,使用我自己的分析器+ PhraseQuery比使用QueryParser.parse(QueryParser.escape(...我的大输入...))得到更好的结果-最终创建一个大的布尔/术语查询.

但我不能尝试使用PhraseQuery方法来实现真实世界的例子,我想我必须使用像ShingleAnalyzerWrapper这样的N-Gram方法,但由于我的输入文件可能非常大,因此组合系统将难以处理. .

换句话说,我被卡住了,任何想法都会非常感激:)

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

谢谢 !

jpo*_*ntz 2

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

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

编辑(2013-06-21)

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