我需要能够使用Lucene全文搜索“abc”w / 3“def”w / 5“ghi”。我意识到我可以使用这样的邻近搜索来近似:“abc def ghi”~8。但是,我需要前两个术语的精确度在3以内,而后两个术语的精确度在5以内。我能想到这样做的唯一方法是搜索: “abc def ghi”~8&& “abc def”~3&& “def ghi”~5。有没有人对如何解决这个问题有任何其他想法,或许更有效率?
答案 0 :(得分:1)
“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
我认为您不希望搜索结果中包含第二个文档。
我对Lucene的.NET版本了解不多。它似乎支持跨度查询。您可以使用跨度查询进行邻近搜索。
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查询进行搜索。
对于mor信息,请查看Mark Miller关于span queries的文章。
答案 1 :(得分:0)
我遇到了完全相同的问题。 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))
我使用pyparsing
在python中编写了查询解析器。这是一个项目,但它是一个有趣的项目,你最终得到的东西比lucene查询解析器更强大。