2

在过滤器与查询上下文中的布尔查询中运行模糊查询时,我看到了一些奇怪的效果。我在 Elasticsearch 6.0.0 上。

我有一个索引,其文档有一个字段firstName。如果我运行以下命令,例如:

{
  "query": {
    "fuzzy": {
      "firstName": {
        "value": "yvonne",
        "fuzziness": 1
      }
    }
  }
}

我得到 5596 次点击。现在,如果我将模糊术语粘贴在 bool must 子句中:

{
  "query": {
    "bool": {
      "must": [
        {
          "fuzzy": {
            "firstName": {
              "value": "yvonne",
              "fuzziness": 1
            }
          }
        }
      ]
    }
  }
}

我仍然得到 5596。如果我将必须更改为过滤子句:

{
  "query": {
    "bool": {
      "filter": [
        {
          "fuzzy": {
            "firstName": {
              "value": "yvonne",
              "fuzziness": 1
            }
          }
        }
      ]
    }
  }
}

一样,又是5596。不足为奇,对吧?

让我们fuzziness改为 2 而不是 1。再次运行简单的模糊术语查询:

{
  "query": {
    "fuzzy": {
      "firstName": {
        "value": "yvonne",
        "fuzziness": 2
      }
    }
  }
}

现在我得到了 6079 次点击。较大的编辑距离应该匹配更多的文档,似乎是合理的。现在,我将再次将其作为必须子句粘贴在 bool 查询中:

{
  "query": {
    "bool": {
      "must": [
        {
          "fuzzy": {
            "firstName": {
              "value": "yvonne",
              "fuzziness": 2
            }
          }
        }
      ]
    }
  }
}

仍然是 6079。现在将 must 子句更改为过滤器:

{
  "query": {
    "bool": {
      "filter": [
        {
          "fuzzy": {
            "firstName": {
              "value": "yvonne",
              "fuzziness": 2
            }
          }
        }
      ]
    }
  }
}

这将返回7980次点击。

据我了解,布尔查询中的 must 和 filter 子句之间的唯一区别是命中是否计分。但这似乎不是真的。在过滤器上下文中运行模糊查询似乎使查询的选择性降低。我错过了什么?这可能是什么原因造成的?

4

0 回答 0