我需要能够使用 Lucene 对带有 3 个“def”和 5 个“ghi”的“abc”进行全文搜索。我意识到我可以使用这样的邻近搜索来近似:“abc def ghi”~8。但是,我需要前两项的精确精度在 3 以内,后两项在 5 以内。我能想到的唯一方法是搜索:“abc def ghi”~8 &&“abc def”~3 &&“def ghi”~5。有没有人对如何解决这个问题有任何其他想法,也许更有效?
2 回答
"abc def ghi"~8 && "abc def"~3 && "def ghi"~5 不同于 "abc" w/3 "def" w/5 "ghi" 这就是为什么
我假设您想查找包含以下条款的文档:
abc,1,2,3,def,1,2,3,4,5,ghi
这两个查询都会找到上面的文档。但是第一个查询也会找到这个
abc 1,2,3,4,5,6,7,8,def,1,2,3,4,5,6,8 ghi , a,b,c,d,e,f,g,h, i,abc,1,2,3,def,1,2,3,4,5,6,7,8,9,10,def,1,2,3,4,5,ghi
我认为您不希望在搜索结果中出现第二个文档。
我对 .NET 版本的 Lucene 了解不多。似乎它支持跨度查询。您可以使用跨度查询进行邻近搜索。
SpanNearQuery spanNear = new SpanNearQuery(new SpanQuery[] {
new SpanTermQuery(new Term(FIELD, "abc")),
new SpanTermQuery(new Term(FIELD, "def"))},
3,
true);
Query queryToBeExecuted = new SpanNearQuery(new SpanQuery[] {
spanNear,
new SpanTermQuery(new Term(FIELD, "ghi"))},
5,
true);
您可以使用 queryToBeExecuted 查询进行搜索。
有关更多信息,请查看 Mark Miller 关于跨度查询的文章。
我遇到了完全相同的问题。Lucene 的查询语言不是很健壮。除了无法将邻近搜索串在一起之外,在邻近查询中执行布尔运算和短语查询也很困难。
我通过编写自己的查询解析器并手动实例化查询原语解决了这个问题。编写自己的查询解析器并不容易,但它为您提供了很大的灵活性。在我的新查询语言中,我使用 w/N 来指定邻近查询。有了它,以下复杂的查询成为可能:
foo w/3 bar w/5 biz
foo w/3 bar w/5 (biz or buz)
甚至更复杂的查询
("first part" within/3 foo) w/10 ("second part" within/3 (bar or biz))
我在 python 中使用pyparsing
. 这是一个项目,但它是一个有趣的项目,你最终会得到比 lucene 查询解析器更强大的东西。