我正在开发一个项目,我们索引相对较小的文档/句子,我们希望使用大型文档作为查询来搜索这些索引。这是一个相对简单的例子: 我正在索引文档:
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”显示出相同的分数。
谢谢!
答案 0 :(得分:2)
我不知道您有多少句话,但您可能想要反转问题:将您的句子存储为查询,将传入的文档编入transient in-memory index索引并对其运行所有查询以查找匹配的。
(注意:这是Elasticsearch的{{3}}的工作方式。)
编辑(2013-06-21):
如果您的句子数量非常多,那么将句子存储在索引中可能会更好。但是,您可以尝试使用Lucene的percolator进行索引,而不是使用短语查询。在查询时,您手动构建查询而不是使用QueryParser的方法是很好的,但如果您索引带状疱疹,您可以构建一个纯布尔查询,其中每个子句匹配木瓦而不是短语查询。