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

时间:2013-06-20 17:07:00

标签: java lucene

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

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大输入......)) - 最终会创建一个大的布尔/术语查询。

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

换句话说,我被困住了,任何想法都会受到高度赞赏:)

P.S。我没有提到它,但索引小文档的烦人之一也是因为“规范” - 值(浮点)仅在1个字节上编码,所有3-4个单词的句子得到相同的标准值,所以搜索像“ABC”这样的句子使得结果“ABC”和“ABCD”显示出相同的分数。

谢谢!

1 个答案:

答案 0 :(得分:2)

我不知道您有多少句话,但您可能想要反转问题:将您的句子存储为查询,将传入的文档编入transient in-memory index索引并对其运行所有查询以查找匹配的。

(注意:这是Elasticsearch的{​​{3}}的工作方式。)

编辑(2013-06-21)

如果您的句子数量非常多,那么将句子存储在索引中可能会更好。但是,您可以尝试使用Lucene的percolator进行索引,而不是使用短语查询。在查询时,您手动构建查询而不是使用QueryParser的方法是很好的,但如果您索引带状疱疹,您可以构建一个纯布尔查询,其中每个子句匹配木瓦而不是短语查询。