【问题标题】:Elastic Search exact match query with wildcard search for multiple fields使用通配符搜索多个字段的 Elastic Search 完全匹配查询
【发布时间】:2021-07-22 16:27:15
【问题描述】:

我有像下面这样的弹性搜索数据存储,我需要通过这些数据编写多搜索 ES 查询,完全匹配和完全匹配 + *(通配符)

[
  {
    "id": "123",
    "name": "test123 abc bct",
    "externalObj": {
      "id": "abc 123"
    }
  },
  {
    "id": "124",
    "name": "test124 abc bct",
    "externalObj": {
      "id": "abc 124"
    }
  }
]

目前我已经写了如下查询,

{
  "query": {
    "query_string": {
      "fields": [
        "name^5",
        "id",
        "externalObj.*"
      ],
      "query": "(test124 abc)",
      "default_operator": "AND"
    }
  }
}

以上查询在完全匹配的情况下工作正常,但我还需要获取部分搜索的数据和响应的最大相关分数。那个东西不适用于这个查询。

例如:“查询”:“test124 ab”

谁能帮我解决上述问题?

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    有 2 个选项可以实现您想要的。您可以选择其中一种来使用:

    1. default_operator 设置为OR(或者直接删除它,因为默认值为OR)。
    {
      "query": {
        "query_string": {
          "fields": [
            "name^5",
            "id",
            "externalObj.*"
          ],
          "query": "test124 a"
        }
      }
    }
    
    1. 将您的查询更改为test124 a*
    {
      "query": {
        "query_string": {
          "fields": [
            "name^5",
            "id",
            "externalObj.*"
          ],
          "query": "test124 a*",
          "default_operator": "AND"
        }
      }
    }
    

    【讨论】:

    • 根据您的建议,完全匹配工作正常,部分匹配也适用于一种情况,它适用于“test124 abc*”但不适用于“test124 ab*”
    • 这很奇怪。两者都适合我。当您尝试test124 ab* 时,您是否将default_operator 保留为AND
    • 是的,如果我们删除 default_operator: "AND" 它会得到正确对象的不必要结果,并且我们给出的查询输入没有正确的排序顺序
    • 只是我想得到“query”的“test124 abc bct”结果:“test124 a”
    • 我用示例查询更新了我的答案。请尝试一下。对于这两种选择,我都会回复test124 abc bct
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2023-01-13
    • 2015-07-13
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多