【问题标题】:Querying Specific List Indexes In Elastic Search在 Elastic Search 中查询特定列表索引
【发布时间】:2021-05-21 22:44:12
【问题描述】:

所以我在 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
            }
          }
         }
        ]
       }
      }

它会返回真,因为

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

【问题讨论】:

    标签: elasticsearch kibana


    【解决方案1】:

    当您与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"
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 哦,酷!这看起来应该可行,给我一个小时来实施。
    • 很好,试一试!
    • 所以这真的很接近答案,我们只需要调整过滤器,让我编辑它并接受。感谢您的帮助!
    • 哦,顺便说一句,StackOverflow 上的编辑工作使得人们必须批准您的编辑,其中两人拒绝了您的编辑:prnt.sc/100pl05 说这偏离了我的初衷......您可以按原样接受这个答案并且当然,无论您在哪里使用它都可以调整代码。希望这是有道理的。
    • 够了,等一下。
    【解决方案2】:

    所以Joe's 答案就在附近,他说得对,您需要使用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"
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2020-08-21
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多