在 Elastic Search 中查询特定的列表索引

Querying Specific List Indexes In Elastic Search

所以我在 Elasticsearch 中有一个搜索查询,它查询一个名为 myList 的字段。该列表中包含元素。 elm1、elm2 和 elm3。我希望能够查询该列表,以便所有元素都必须匹配。例如:

myList: [{
   elm1: "value1",
   elm2: "value2",
   elm3: "value4"
   },
   {
   elm1: "value2"
   elm2: "value3"
   elm3: "value3"
   },
   {
   elm1: "value3",
   elm2: "value4",
   elm3: "value5"
   }]

如果我构建查询以搜索以下字段:elm1 = value1 and elm2 = value2 and elm3=value3,

"query": {
"bool": {
  "must": [],
  "filter": [
    {
      "bool": {
        "filter": [
          {
            "bool": {
              "should": [
                {
                  "query_string": {
                    "fields": [
                      "myList.elm1.keyword"
                    ],
                    "query": "value1"
                  }
                }
              ],
              "minimum_should_match": 1
            }
          },"bool": {
        "filter": [
          {
            "bool": {
              "should": [
                {
                  "query_string": {
                    "fields": [
                      "myList.elm2.keyword"
                    ],
                    "query": "value2"
                  }
                }
              ],
              "minimum_should_match": 1
            }
          },"bool": {
        "filter": [
          {
            "bool": {
              "should": [
                {
                  "query_string": {
                    "fields": [
                      "myList.elm3.keyword"
                    ],
                    "query": "value3"
                  }
                }
              ],
              "minimum_should_match": 1
            }
          }
         }
        ]
       }
      }

它将 return 为真,因为

myList[0]['elm1']=value1 
myList[0]['elm2']=value2 
myList[1]['elm3']=value3

这不是我想要的。

我怎样才能得到它

myList[x]['elm1']=value1 
myList[y]['elm2']=value2 
myList[z]['elm3']=value3

其中 x=y=z

当您处理 arrays of objects 时,这些对象会变得扁平并且基本上失去彼此之间的联系。

您应该改用 nested field type

PUT elms_deep
{
  "mappings": {
    "properties": {
      "myList": {
        "type": "nested"
      }
    }
  }
}

然后重新添加您的文件:

POST elms_deep/_doc
{
  "myList": [
    {
      "elm1": "value1",
      "elm2": "value2",
      "elm3": "value4"
    },
    {
      "elm1": "value2",
      "elm2": "value3",
      "elm3": "value3"
    },
    {
      "elm1": "value3",
      "elm2": "value4",
      "elm3": "value5"
    }
  ]
}

然后继续 3 个 nested term 查询——当您定位 .keyword 字段时,不需要您原来的 query_string 查询:

POST elms_deep/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "myList",
            "query": {
              "term": {
                "myList.elm1.keyword": {
                  "value": "value1"
                }
              }
            }
          }
        },
        {
          "nested": {
            "path": "myList",
            "query": {
              "term": {
                "myList.elm2.keyword": {
                  "value": "value2"
                }
              }
            }
          }
        },
        {
          "nested": {
            "path": "myList",
            "query": {
              "term": {
                "myList.elm3.keyword": {
                  "value": "value3"
                }
              }
            }
          }
        }
      ]
    }
  }
}

所以 answer is nearly there, he's right you need to use the nested field type。他的回答给出了

的可能性
myList[x]['elm1']=value1 
myList[y]['elm2']=value2 
myList[z]['elm3']=value3

其中x,y,z为独立元素。

如果你想要 x=y=z:

{
  "query": {
    "nested": {
      "path": "myList",
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "myList.elm1.keyword": {
                  "value": "value1"
                }
              }
            },
            {
              "term": {
                "myList.elm1.keyword": {
                  "value": "value1"
                }
              }
            },
            {
              "term": {
                "myList.elm1.keyword": {
                  "value": "value1"
                }
              }
            }
          ]
        }
      }
    }
  }
}