混合起来

精确短语匹配 或许是过于严格了。也许我们想要包含 quick brown fox'' 的文档也能够匹配quick fox,’’ , 尽管情形不完全相同。

我们能够通过使用 slop 参数将灵活度(((“slop parameter”)))引入短语匹配中:

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "title": {
  6. "query": "quick fox",
  7. "slop": 1
  8. }
  9. }
  10. }
  11. }

slop 参数告诉 match_phrase 查询词条相隔多远时仍然能将文档视为匹配 (((“match_phrase query”, “slop parameter”))) 。 相隔多远的意思是为了让查询和文档匹配你需要移动词条多少次?

我们以一个简单的例子开始吧。 为了让查询 quick fox 能匹配一个包含 quick brown fox 的文档, 我们需要 slop 的值为 1:

  1. Pos 1 Pos 2 Pos 3
  2. -----------------------------------------------
  3. Doc: quick brown fox
  4. -----------------------------------------------
  5. Query: quick fox
  6. Slop 1: quick fox

尽管在使用了 slop 短语匹配中所有的单词都需要出现, 但是这些单词也不必为了匹配而按相同的序列排列。 有了足够大的 slop 值, 单词就能按照任意顺序排列了。

为了使查询 fox quick 匹配我们的文档, 我们需要 slop 的值为 3:

  1. Pos 1 Pos 2 Pos 3
  2. -----------------------------------------------
  3. Doc: quick brown fox
  4. -----------------------------------------------
  5. Query: fox quick
  6. Slop 1: fox|quick (1)
  7. Slop 2: quick fox
  8. Slop 3: quick fox

<1> 注意 foxquick 在这步中占据同样的位置。 因此将 fox quick 转换顺序成 quick fox 需要两步, 或者值为 2slop