&引用;abc";w/3“;def";w/5“;ghi“;(使用Lucene进行精确接近搜索)

&引用;abc";w/3“;def";w/5“;ghi“;(使用Lucene进行精确接近搜索),lucene,lucene.net,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。有没有人对如何解决这个问题有任何其他的想法,也许更有效?“abc def ghi”~8&&“abc def”~3&&“def ghi”~5与“abc”w/3“def”w/5“ghi

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

“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版本了解不多。它似乎支持span查询。您可以使用范围查询进行邻近搜索

    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关于的文章

“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版本了解不多。它似乎支持span查询。您可以使用范围查询进行邻近搜索

    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关于的文章

我面临着完全相同的问题。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查询解析器强大得多的东西。

我也遇到了同样的问题。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查询解析器更强大的东西