ElasticSearch查询未返回数组的完全匹配

时间:2019-11-30 16:36:02

标签: elasticsearch elastic-stack mongoosastic

我有一个关于Elasticsearch数组查询的问题。在我的情况下,自定义属性的结构是一个对象数组,每个对象包含inner_namevalue,值的类型混合在一起(可以是字符串,数字,数组,Date..etc等) ,其中一种类型是multi-checkbox,它应将数组作为输入。如下映射custom_attributes

"attributes" : {
              "properties" : {
                "_id" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "inner_name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "value" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },

我使用mongoosastic将MongoDB索引到ES的位置,因此自定义属性的结构如下:

[
  {
    customer_name: "customerX",
    "custom_attributes" : [
      {
        "group" : "xyz",
        "attributes" : [
          {
            "inner_name" : "attr1",
            "value" : 123,
          },       
          {
            "inner_name" : "attr2",
            "value" : [
              "Val1",
              "Val2",
              "Val3",
              "Val4"
            ]
          }
        ]
      }
    ]
  },
  {
    customer_name: "customerY",
    "custom_attributes" : [
      {
        "group" : "xyz",
        "attributes" : [
          {
          "inner_name" : "attr2",
            "value" : [
              "Val1",
              "Val2"
            ]
          }
        ]
      }
    ]
  }
]

我想执行一个查询,其中所有值都必须在数组中。但是,以下查询的问题在于,只要它包含数组中的任何值,它都会返回文档。这是查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "custom_attributes.attributes.inner_name": "attr2"
          }
        },
        {
          "terms": {
            "custom_attributes.attributes.value": [
              "val1",
              "val2",
              "val3",
              "val4"
            ]
          }
        }
      ]
    }
  }
}

例如,它返回两个文档,仅应返回第一个文档!我的查询出了什么问题?还有另一种写查询的方法吗?

1 个答案:

答案 0 :(得分:1)

elasticsearch术语查询会尝试匹配文档中是否存在您的任何值,请考虑将运算符设为driver.restartApp()而不是想要的OR。有两种解决方案

  1. 在bool必须查询中使用多个AND查询,这将提供所需的term功能
AND
  1. 将匹配查询与运算符{ "query": { "bool": { "must": [ { "match": { "custom_attributes.attributes.inner_name": "attr2" } }, { "term": { "custom_attributes.attributes.value": "val1" } }, { "term": { "custom_attributes.attributes.value": "val2" } }, { "term": { "custom_attributes.attributes.value": "val3" } }, { "term": { "custom_attributes.attributes.value": "val4" } } ] } } } AND分析器一起使用。如果您的字词包含空格,则将不会起作用
whitespace