问题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
。要匹配上面相同的索引文本,需要多少斜率?我希望一定会出现2
,但是0
或1
呢?
同样,对于相同的三子句查询,需要什么斜率来匹配文本:foo bar ble biz
最佳答案
问题1: Slop是分隔span子句的单词数。因此,斜率0表示它们相邻。在我给出的示例中,斜率1将匹配。
问题2::如果有两个以上的span近子句,则每个子句必须与至少一个其他子句连接,且不得超过斜线分隔它们,并且所有子句必须通过一条链相互连接。但是,每个子句不必与其他子句用斜线分隔。
对于第一个问题2的示例:斜率0、1和2都将匹配。即使foo
和biz
被一个以上的分隔开,也不会出现零匹配,因为所有子句之间都有一条链。
对于问题2的第二个示例,斜率0将不匹配,因为biz
与所有其他子句分隔的斜率大于0。斜率1将匹配,因为foo
和bar
用0斜率分隔,此外bar
和biz
用1斜率分隔。即使foo
和biz
分隔不止一个,它也会匹配,因为所有子句之间都有一条链。斜率2将明显匹配。