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

22
问题1:在Lucene的SpanNearQuery(或ElasticSearch中的span_near)中,slop的确切含义是什么?它是匹配两个单词之间隔开的单词数,还是隔开的单词数加1?
例如,如果索引文本为:foo bar biz 哪些查询将匹配此文本:"foo biz"~0"foo biz"~1"foo biz"~2 我期望第一个查询不匹配,最后一个查询匹配。但是中间的查询呢? 问题2:现在是一个更复杂的相关问题:如果有多于两个搜索条款,slop如何处理?它是应用于每一对子句还是任意一对子句?
例如,假设您构造了一个包含三个子句的SpanNearQueryfoobarbiz。需要什么样的slop才能匹配上面相同的索引文本?我认为2slop肯定可以,但是01呢?
同样,在相同的三个子句查询中,需要什么样的slop才能匹配文本:foo bar ble biz

1
你有一个问题,通过尝试可以得到确切的答案。 - fatih
7
是的,我有点明白了......但有时在 Stack Overflow 上写下来会让问题在你脑海中变得更加清晰。 - speedplane
2个回答

27

问题1:“Slop”是用于分隔跨度子句的单词数。因此,slop 0表示它们是相邻的。在我所提供的示例中,slop为1。

问题2:当存在两个以上的跨度子句时,每个子句必须通过不超过slop个单词与至少一个其他子句连接,并且所有子句都必须通过链式连接彼此。然而,每个子句之间不需要互相隔开slop个单词。

对于问题2中的第一个示例:slop为0、1和2都匹配。尽管“foo”和“biz”之间相隔多个单词,但由于存在通过所有子句的链,因此slop为零也匹配。

对于问题2中的第二个示例:slop为0不匹配,因为“biz”与所有其他子句相隔超过0个单词。 slop为1会匹配,因为“foo”和“bar”之间的距离为0,此外,“bar”和“biz”之间的距离是1。即使“foo”和“biz”之间的距离超过1,由于存在通过所有子句的链,因此也匹配。显然,slop为2也匹配。


谢谢您的解释。我正在使用slop=0match_phrase,它的效果与您描述的一样。假设我需要仅提高相邻术语(slop=0)的得分,以便具有更多未匹配位置的术语将不太相关,例如foo biz(更高的得分),而foo biz dev则得分较低,该如何实现? - loretoparisi
2
@loretoparisi 我猜你只需要通过将查询的部分用 BoostQuery 包装起来来增加其权重。 - Anton Zvonovsky

0

这是在Span查询附近解释的。

匹配彼此相邻的span。可以指定slop,即最大数量的未匹配位置, 以及是否需要按顺序匹配。Span near查询映射到Lucene SpanNearQuery。

官方文档-https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-span-near-query.html

例子 你想匹配布什先生并获取有关他们的详细信息。由于有两个 不相似的单词,因此slop值为2

George Willam Bush先生, Sean Willam Bush先生, James Kane Bush先生

示例DSL请求-

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接