【问题标题】:Why fuzzy query returns a match but query with fuzziness doesn't on the same input?为什么模糊查询返回匹配但模糊查询不在同一输入上?
【发布时间】:2021-09-21 18:51:51
【问题描述】:

我在 Elasticsearch 中创建了以下索引:

PUT /my-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "whitespace",
          "filter": ["lowercase", "3_5_edgegrams"]
        }
      },
      "filter": {
        "3_5_edgegrams": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 10
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

然后我插入了以下文档:

{
  "name": "Nuvus Gro Corp"
}

当我进行以下查询时(我们称之为fuzzy_query):

GET /my-index/_search
{
  "query": {
    "fuzzy": {
      "name": {
        "value": "qnuv"
      }
    }
  }
}

我得到了上述文档的匹配项。

当我进行查询时(我们将查询称为match_with_fuzziness):

GET /my-index/_search
{
  "query": {
    "match": {
      "name": {
        "query": "qnuv",
        "fuzziness": "AUTO"
      }
    }
  }
}

我没有得到匹配。如果我进行以下查询:

GET /my-index/_search
{
  "query": {
    "match": {
      "name": {
        "query": "nuvq",
        "fuzziness": "AUTO"
      }
    }
  }
}

我又得到了一场比赛。我不明白为什么当我进行match_with_fuzziness 查询时我没有得到任何匹配项。

编辑:我用 Kibana Profiler 分析了查询,根据分析器,match_with_fuzzinessSynonymQuery Synonym(name:qnu name:qnuv) 查询,而 fuzzy_queryBoostQuery (name:nuv)^0.6666666

【问题讨论】:

    标签: elasticsearch string-matching


    【解决方案1】:

    your other question 中解释的问题非常相似。

    问题是您没有指定特定的search_analyzer,因此在搜索时qnuvnuvq 也会被my_analyzer 和edge-ngramed 分析,因此您收到的匹配.

    如果我们检查第一个查询,由于您使用的是 fuzzy 查询,qnuv(搜索词)将匹配距离为 1 的 nuv(第一个索引的边-ngramed 标记)(即第一个q 是“容忍的”),这是fuzzy 查询默认执行的操作(使用"fuzziness: AUTO"

    在第三个查询中,nuv(搜索词的第一个边编码标记)将匹配 nuv(第一个索引的边编码标记)。

    第二个查询的情况有点特殊,我在下面引用fuzziness parameter works in the context of match queries

    模糊匹配不适用于具有同义词的术语或分析过程在同一位置产生多个标记的情况。在后台,这些术语被扩展为混合术语频率的特殊同义词查询,不支持模糊扩展。

    粗体部分适用于您的情况。由于搜索词qnuv是由my_analyzer分析的,所以会在同一位置产生qnuqnuv这两个token,不支持模糊匹配。

    您需要将映射更改为这个,它会按照您期望的方式工作,即所有三个查询都将返回您的文档:

      "mappings": {
        "properties": {
          "name": {
            "type": "text",
            "analyzer": "my_analyzer",
            "search_analyzer": "standard"          <---- add this line
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2011-11-26
      • 2019-01-22
      • 2017-11-14
      • 2015-01-10
      相关资源
      最近更新 更多