首页 > 解决方案 > Elasticsearch 模糊查询

问题描述

我正在尝试进行应该像这样的模糊搜索

模糊搜索智人

我有这样的索引

{
  "test": {
    "aliases": {},
    "mappings": {
      "properties": {
        "first_name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "last_name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    },
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        },
        "number_of_shards": "1",
        "provided_name": "test",
        "creation_date": "1617623285742",
        "number_of_replicas": "1",
        "uuid": "MxSWoxSoS6y6x5Jdt2AvMQ",
        "version": {
          "created": "7120099"
        }
      }
    }
  }
}

在该索引内有一个数据

{
  "first_name": "homo sapiens",
  "last_name": "moho"
}

我试图像这样查询,但它不起作用

{
    "query": {
        "match": {
            "first_name": {
                "query": "hosan",
                "fuzziness": "AUTO:0,0"
            }
        }
    }
}

但如果我用“hoom”、“homoo”或“homos”搜索它就可以了。

有人可以帮我做这个模糊搜索吗?谢谢!

标签: elasticsearchfuzzy-search

解决方案


对于由 5 个字符 (hosan) 组成的查询词,模糊度值auto只会为您提供 1 的编辑距离值,这不足以让您从 hosan 到 homo。您可以实现的最大编辑距离值为auto2,并且只有在查询词大于 5 个字符时才能实现。您可以强制使用 3 或 4 的模糊度值来尝试达到您想要的结果,但 ES 默认最大值为 2 的原因是因为更高的数字可能会开始产生意外和笨拙的结果。另请注意,您的其他搜索示例(hoom、homoo 等)仅匹配单词 homo。匹配查询默认为 OR 查询,并将返回任何匹配项的结果。

仅供参考,auto对于长度为 1-2 个字符的查询词,将为您提供 0 编辑距离,为 3-5 个字符的查询词提供 1 个编辑距离,为大于 5 个字符的查询词提供 2 个编辑距离。

因此,我会将您的模糊度值提高 1,直到您在 hosan 上搜索时得到返回的结果,但这只是为了证明我在这里概述的内容。在任何生产环境中,我个人都不会超过 2 甚至 3 的模糊值。


推荐阅读