首页 > 解决方案 > Elasticsearch 模糊性并不总是匹配

问题描述

我们将弹性搜索用于 globalsearch 和 quicksearch,并具有通用配置。

globalsearch 能够搜索多种类型,而 quicksearch 只会查找一种类型(这是由通用组件使用的)。

quicksearch 应该搜索的类型之一称为workorder. 我有几个工单,其中两个是这样存储的:

{
    "_source": {
        "name": "70187"
    }
}

{
    "_source": {
        "name": "60255"
    }
}

但是,我从模糊中得到了一些意想不到的行为:

我使用这个配置:

{
    "query": {
        "bool": {
            "should": [
                {
                    "multi_match": {
                        "fields": [
                            "name",
                            "last_name",
                            "first_name"
                        ],
                        "fuzziness": 1,
                        "max_expansions": 1,
                        "query": 6025,
                        "type": "most_fields"
                    }
                },
                {
                    "multi_match": {
                        "fields": [
                            "name",
                            "last_name",
                            "first_name"
                        ],
                        "max_expansions": 1,
                        "query": 6025,
                        "type": "most_fields"
                    }
                },
                {
                    "multi_match": {
                        "fields": [
                            "content",
                            "description"
                        ],
                        "max_expansions": 1,
                        "query": 6025,
                        "slop": 5,
                        "type": "best_fields"
                    }
                },
                {
                    "multi_match": {
                        "boost": 15,
                        "fields": [
                            "_id",
                            "reference",
                            "mobilenumber",
                            "phonenumber",
                            "batchnumber",
                            "number"
                        ],
                        "max_expansions": 1,
                        "query": 6025,
                        "type": "best_fields"
                    }
                }
            ]
        }
    }
}

为什么要这样做?我该如何解决?

编辑(1)

我忘了提到我正在运行 ElasticSearch 5.6。

编辑(2)

显然,仅凭我提到的两条记录,我就能很好地找到两个工单。我删除了我正在使用的索引。

在添加另外两个现有工单后,我仅用四条记录就能重现问题。

新增的两条记录是:

{
    "name" : "70186"
}

{
    "name" : "68012"
}

如果它很重要,这四个记录的 ID 是:

编辑(3)

重现步骤:https ://gist.github.com/DevMcC/fe890dcbcba806da8086c4811a0db776

标签: elasticsearchelasticsearch-5fuzzy-search

解决方案


在 Elasticsearch fuzziness 中,您应该传递参数

 "prefix_length":1 // 0,1,2...

创建扩展时保持不变的起始字符数。默认为 0。

模糊查询在指定的编辑距离内创建一组搜索词的所有可能变化或扩展。

在你的情况下 -

"fuzziness": 1,
GET /_search
{
  "query": {
    "fuzzy": {
      "user.id": {
        "value": "ki",
        "fuzziness": "AUTO",
        "max_expansions": 50,
        "prefix_length": 0,
        "transpositions": true,
        "rewrite": "constant_score"
      }
    }
  }
}

推荐阅读