“abc”w / 3“def”w / 5“ghi”(使用Lucene的精确邻近搜索)

时间:2012-06-29 14:27:17

标签: lucene lucene.net

我需要能够使用Lucene全文搜索“abc”w / 3“def”w / 5“ghi”。我意识到我可以使用这样的邻近搜索来近似:“abc def ghi”~8。但是,我需要前两个术语的精确度在3以内,而后两个术语的精确度在5以内。我能想到这样做的唯一方法是搜索: “abc def ghi”~8&& “abc def”~3&& “def ghi”~5。有没有人对如何解决这个问题有任何其他想法,或许更有效率?

2 个答案:

答案 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查询解析器更强大。