4

在 Solr 中,您可以使用语法执行有序的邻近搜索

"word1 word2"~10

通过有序,我的意思是 word1 在文档中总是排在 word2 之前。我想知道是否有一种简单的方法来执行无序的邻近搜索,即。word1 和 word2 出现在彼此相距 10 个单词之内,无论哪个先出现都没有关系。

一种方法是:

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

以上将起作用,但如果可能的话,我正在寻找更简单的东西。

4

3 回答 3

8

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. 按照您的建议手动分离您的搜索

我认为#2可能更好,除非您的坡度一开始就很大。

于 2010-11-03T14:25:22.747 回答
2

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

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

这个标准请求处理程序的示例将查找在“电影”的 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

于 2010-11-02T16:00:14.427 回答
1

从 Solr 4 开始,可以使用SurroundQueryParser

例如进行有序搜索(查询“短语二”跟在“短语一”之后不超过 3 个单词):

3W(phrase W one, phrase W two)

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

5N(phrase W one, phrase W two)
于 2013-11-11T12:58:50.037 回答