Solr接近有序与无序

时间:2010-11-02 15:45:14

标签: search lucene solr proximity

在Solr中,您可以使用语法

执行有序的邻近搜索
"word1 word2"~10

按顺序排列,我的意思是word1将始终位于文档中的word2之前。我想知道是否有一种简单的方法来执行无序的邻近搜索,即。 word1和word2出现在彼此的10个单词之间,首先出现的并不重要。

这样做的一种方法是:

"word1 word2"~10 OR "word2 word1"~10

上述方法可行,但如果可能,我正在寻找更简单的方法。

3 个答案:

答案 0 :(得分:7)

Slop表示可以发生多少个单词转置。所以“a b”将与“b a”不同,因为允许不同数量的转置。

  • a foo b有位置(a,1),(foo,2),(b,3)。要匹配(a,1),(b,2)将需要一个改变:(b,2)=> (B,3)
  • 但是,要匹配(b,1),(a,2),您需要(a,2)=> (a,1)和(b,1)=> (b,3),总共三个位置移动

一般情况下,如果"a b"~n与某些内容匹配,那么"b a"~(n+2)也会匹配。

编辑:我想我从未给出答案。我看到两个选择:

  1. 如果你想要一个n的斜率,将它增加到n + 2
  2. 像您建议的那样手动取消您的搜索
  3. 我认为#2可能更好,除非你的slop非常大。

答案 1 :(得分:2)

你确定它已经不能那样了吗?文档中没有任何内容表明它是“有序的”:

可以使用草率短语查询来完成邻近搜索。文档中出现的两个术语越接近,得分就越高。一个草率的短语查询指定一个最大的“slop”,或者需要移动一个令牌的位置数来获得匹配。

标准请求处理程序的这个示例将找到“batman”出现在“movie”的100个单词中的所有文档:

http://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_search_for_one_term_near_another_term_.28say.2C_.22batman.22_and_.22movie.22.29

答案 2 :(得分:1)

从Solr 4开始,可以SurroundQueryParser

E.g。做有序搜索(查询“短语二”跟在“短语一”后不超过3个单词):

3W(phrase W one, phrase W two)

进行无序搜索(在“短语一”的5个单词附近查询“短语二”):

5N(phrase W one, phrase W two)