Lucene SpanNearQuery中的“Slop”的确切含义(或ElasticSearch中的slop span_near)

时间:2014-02-14 13:54:41

标签: lucene elasticsearch proximity

问题1: 在Lucene的SpanNearQuery(或ElasticSearch中的span_near)中,slop的确切含义是什么?是分隔两个匹配单词的单词数,还是分隔单词数加1?

例如,假设您的索引文本为:foo bar biz

哪些查询符合此文字:"foo biz"~0"foo biz"~1"foo biz"~2

我希望第一个不匹配而最后一个会匹配。但中间呢?

问题2: 现在是第二个更复杂的推论问题:如果有两个以上的搜索条款,slop如何处理?它是否适用于每个子句对或任何子句对。

例如,假设您构建了一个包含三个子句的SpanNearQueryfoobarbiz。匹配上面相同的索引文本需要什么样的slop?我希望2肯定会出现这种情况,但是01呢?

同样,使用相同的三个子句查询,匹配文本需要什么样的slop:foo bar ble biz

2 个答案:

答案 0 :(得分:15)

问题1: Slop是分隔span子句的单词数。所以slop 0意味着他们相邻。在我给出的例子中,1的slop匹配。

问题2: 当有两个以上的跨度近子句,每个子句必须不再被连接到至少一个其它条款比污话将它们分离和所有条款必须通过链条相互连接。但是,每个条款不需要用slop words来区分每个其他条款。

对于问题2中的第一个例子:0,1和2的斜率都匹配。即使foobiz被多个分隔,因此零匹配也是如此,因为所有子句都有一个链。

对于问题2中的第二个示例:slop为0将不匹配,因为biz与所有其他子句分开超过0 slop。 Slop of 1会匹配,因为foobar被0 slop分隔,此外barbiz被1 slop分隔。即使foobiz被多个分隔,它也会匹配,因为所有子句都有链。 Slop of 2显然会匹配。

答案 1 :(得分:0)

在“查询附近的跨度”中对此进行了解释

匹配跨度彼此接近的跨度。可以指定坡度,即不匹配中间位置的最大数量, 以及是否需要按顺序进行匹配。查询附近的跨度映射到Lucene SpanNearQuery。

正式文件-https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/query-dsl-span-near-query.html

示例 您想与布什先生配对并获得有关他们的详细信息。由于有两个 不相似的单词,斜率值为2

先生。乔治·威拉姆·布什, 肖恩·威拉姆·布什先生, 詹姆斯·凯恩·布什先生

示例DSL请求-

  GET school/_search
    {
     "query":{
       "match_phrase": {
         "EmpName":
         {
           "query": "Mr. Bush",
           "slop":2
         }
        
       }
     }
    }