问题1:
在Lucene的SpanNearQuery
(或ElasticSearch中的span_near
)中,slop
的确切含义是什么?是分隔两个匹配单词的单词数,还是分隔单词数加1?
例如,假设您的索引文本是:foo bar biz
哪些查询将与此文本匹配:"foo biz"~0
、"foo biz"~1
、"foo biz"~2
我预计第一个不会匹配,最后一个会匹配。但是中间呢?
问题2:
现在是第二个更复杂的推论问题:如果有两个以上的搜索子句,如何处理slop
?它适用于每对子句还是任何对子句。
例如,假设您构造了一个包含三个子句的SpanNearQuery
:foo
、bar
和biz
。需要什么slop来匹配上面相同的索引文本?我预计2
的斜率肯定会,但0
或1
呢?
类似地,对于相同的三子句查询,需要什么slop来匹配文本:foo bar ble biz
问题1: Slop是分隔span子句的字数。所以斜率0意味着它们是相邻的。在我举的例子中,slop为1会匹配。
问题2: 当有两个以上的span near子句时,每个子句必须通过不超过分隔它们的slop字连接到至少一个其他子句,并且所有子句必须通过链相互连接。然而,每一个从句不需要用其他从句的助词来分隔。
对于问题2中的第一个示例:斜率0、1和2都将匹配。零的斜率匹配,即使foo
和biz
相隔不止一个,因为所有子句都有一条链。
对于问题2中的第二个示例:0的slop将不匹配,因为biz
与所有其他子句的间隔超过0 slop。1的斜率将匹配,因为foo
和bar
由0斜率分隔,此外bar
和biz
由1斜率分隔。即使foo
和biz
相隔不止一个,它也会匹配,因为所有子句都有一条链。斜率为2显然会匹配。
在查询附近的Span中进行了解释
匹配彼此靠近的跨度。可以指定slop、介入的不匹配位置的最大数量,以及是否需要按顺序进行匹配。spannear查询映射到Lucene SpanNearQuery。
正式文件-https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-span-near-query.html
示例你想与布什先生匹配,了解他们的详细情况。既然有两个不相似的单词,slop值为2
Mr。杰奥尔格·威拉姆·布什,肖恩·威拉姆·布什先生,James Kane Bush先生
DSL请求示例-
GET school/_search
{
"query":{
"match_phrase": {
"EmpName":
{
"query": "Mr. Bush",
"slop":2
}
}
}
}