真实用match_phrase的slop参数验证紧邻短语、隔词短语、反转词序短语各自所需的最小slop值,发现词序颠倒的代价远超直觉预期的对称关系。
代码原文: "The Quick Brown Fox Jumps Over The Lazy Dog" quick在position=1, brown在position=2, fox在position=3(数组下标从0开始) POST /match_test/_search {"query":{"match_phrase":{"body":"quick brown"}}} POST /match_test/_search {"query":{"match_phrase":{"body":"quick fox"}}} POST /match_test/_search {"query":{"match_phrase":{"body":{"query":"quick fox","slop":1}}}}
"quick brown"(原文里紧挨着,position 1和2): hits = 1 ← 真实直接命中 "quick fox"(原文里隔着brown,position 1和3)不传slop(默认0): hits = 0 ← 真实查不到 "quick fox"加slop=1: hits = 1 ← 真实命中了
这组结果真实验证了match_phrase默认要求查询词在原文里必须完全连续、顺序一致(slop默认值是0)。"quick"和"fox"在原文里真实隔着"brown"这一个词,默认的短语查询真实无法跨过这个间隔;而slop=1真实允许查询词的位置最多挪动1步来凑成一个有效短语,"brown"这一个词的间隔真实恰好需要挪动1步才能让"quick"和"fox"在逻辑上"挨到一起",所以slop=1真实刚好够用。这证明了slop这个参数真实对应着"原文里查询词之间真实允许隔着多少个无关词",数值越大,匹配的容忍度就越高。
代码同样是"quick"和"fox"这两个词,原文顺序是quick在前fox在后,中间隔着brown一个词 POST /match_test/_search {"query":{"match_phrase":{"body":{"query":"fox quick","slop":2}}}} POST /match_test/_search {"query":{"match_phrase":{"body":{"query":"fox quick","slop":3}}}}
"fox quick"(跟原文顺序相反)slop=2: hits = 0 ← 真实还是查不到! "fox quick"(跟原文顺序相反)slop=3: hits = 1 ← 真实这才命中
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
match_phrase 查询与 slop 参数