Elasticsearch -在多个字段上使用模糊的部分搜索?

3ks5zfa0  于 2022-12-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(173)

我有一个索引,其中包含用户的真实的姓名沿着名称有数字的设施。样本数据如下所示。

dim_employee = [
{"full_name": "Jon Doe", "email_address": "Jondoe123@test.com"}, 
{"full_name": "RIG 876 B&X", "email_address": "BX876RIG@test.com"}]

我希望能够支持模糊搜索错别字以及部分字搜索。
最初,我使用了下面的模糊查询:

GET dim_employee/_search
{
  "query": {
    "multi_match": {
      "fields":  [ "full_name", "email_address" ],
      "query":     "BX876",
      "fuzziness": "AUTO",
       "type": "best_fields"
    }
  }
}

此查询不返回包含BX867文档的记录。但是,如果我只查询876,则会得到预期的结果。搜索用户Jon Doe在此处工作正常。我可能输入错误,但工作正常。部分搜索在此处不返回预期的结果。
然后我尝试执行一个短语前缀查询,如下所示:

GET dim_employee/_search
{
  "query": {
    "multi_match": {
      "fields":  [ "full_name", "email_address" ],
      "query":     "BX867 ",
       "type": "phrase_prefix"
    }
  }
}

这确实可以按预期获取BX867文档,但不再支持模糊匹配。如果我输入错误的用户Jon Doe,我将不会得到任何结果。有没有办法在搜索多个字段时进行模糊匹配和部分短语匹配?

ego6inou

ego6inou1#

你为什么不把两个条款合并起来呢?

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "fields": [
              "full_name",
              "email_address"
            ],
            "query": "BX8676",
            "type": "phrase_prefix"
          }
        },
        {
          "multi_match": {
            "fields": [
              "full_name",
              "email_address"
            ],
            "query": "BX876",
            "fuzziness": "AUTO",
            "type": "best_fields"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

相关问题