【问题标题】:must match query not working as expected in Elasticsearch必须匹配查询在 Elasticsearch 中未按预期工作
【发布时间】:2021-05-20 22:42:36
【问题描述】:

我使用连接到我的 AWS ES 域的 Kibana 在下面创建了我的索引:

PUT sals_poc_test_20210217-7
{
    "settings" : {
      "index" : {
        "number_of_shards" : 10,
        "number_of_replicas" : 1,
        "max_result_window": 50000,
        "max_rescore_window": 50000
      }
    },
    "mappings": {
      "properties": {
        "identifier": {
          "type": "keyword"
        },
        "CLASS_NAME": {
          "type": "keyword"
        },
        "CLIENT_ID": {
          "type": "keyword"
        }
      }
    }
}

然后我索引了 100 个文档,使用以下命令返回所有 100 个文档:

POST /sals_poc_test_20210217-7/_search
{
  "query": {
    "match": {
      "_index": "sals_poc_test_20210217-7"
    }
  }
}

两个示例文档如下:

{
        "_index" : "sals_poc_test_20210217-7",
        "_type" : "_doc",
        "_id" : "cd0a3723-106b-4aea-b916-161e5563290f",
        "_score" : 1.0,
        "_source" : {
          "identifier" : "xweeqkrz",
          "class_name" : "/Sample_class_name_1",
          "client_id" : "random_str"
        }
      },
{
        "_index" : "sals_poc_test_20210217-7",
        "_type" : "_doc",
        "_id" : "cd0a3723-106b-4aea-b916-161e556329ab",
        "_score" : 1.0,
        "_source" : {
          "identifier" : "xweeqkra",
          "class_name" : "/Sample_class_name_2",
          "client_id" : "random_str_2"
        }
      }

但是当我想通过以下命令搜索CLASS_NAME 时:

POST /sals_poc_test_20210217-7/_search
{
  "size": 200,
  "query": { 
    "bool": { 
      "must": [ 
        { "match": { "CLASS_NAME": "/Sample_class_name_1"}}
      ]
    }
  }
}

不仅返回了与此class_name匹配的文档,还返回了其他文档。

谁能解释一下这个案子?

我怀疑我编写搜索查询的方式有问题。但不知道为什么。

谢谢!

【问题讨论】:

    标签: amazon-web-services elasticsearch lucene kibana aws-elasticsearch


    【解决方案1】:

    弹性搜索,区分大小写。 class_name 不等于 CLASS_NAME 示例文档似乎有 class_name 但索引中的映射似乎有 'CLASS_NAME。

    如果我们GET sals_poc_test_20210217-7,两个类名属性都应该在索引映射中。一个在创建索引时创建,第二个在将文档添加到索引时创建。

    因此,查询应该在 CLASS_NAME 或 class_name.keyword 上,默认情况下,弹性搜索会为动态属性创建 text 和 .keyword 字段

        "CLASS_NAME" : {
          "type" : "keyword"
        },
    
        "class_name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
    

    【讨论】:

    • 很好,我可以使用class_name.keyword 搜索并获得正确的结果,但不能使用CLASS_NAME,任何关于如何调整查询的建议,以便我可以使用CLASS_NAME 进行搜索?谢谢!
    • 你有两个属性 CLASS_NAME 和 class_name 有什么原因吗?如果您的数据有 class_name,最好在映射中创建带有小写 class_name 的索引。如果两者都有,则在映射中创建两个属性作为关键字,我们可以修改查询以使用 OR 条件搜索这两个属性
    • 完美,我现在只使用小写字母class_name,通过class_name 搜索返回正确的结果,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2017-07-29
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多