AND查询嵌套对象

时间:2019-07-10 15:59:09

标签: elasticsearch

免责声明:elasticsearch noob在这里。

我将嵌套字段value用于对象数组。每个对象都具有以下属性:id"value_per_id": [ { "id": 2, "value": "positive" }, { "id": 23, "value": "positive" }, { "id": 65, "value": "neutral" } ] 。 例如

{
  "query" : {
    "bool" : {
      "filter" : [
        {
          "bool" : {
            "must" : {
              "nested" : {
                "path" : "value_per_id",
                "query" : [
                  {"terms" : {"value_per_id.value" : <MY_VALUES>}},
                  {"terms" : {"value_per_id.id" : <MY_IDS>}},
                ]
              }
            }
          }
        }
      ]
    }
  }
}

我有一个看起来像这样的查询(为清楚起见进行了编辑):

MY_VAULES = ['positive', 'neutral']

通过此查询,我得到了具有对象的所有元素,其值的值为MY_VALUES或ID为MY_IDS。

我希望所有在MY_VALUES中具有值的元素对于MY_IDS中的任何ID。

(例如,如果MY_IDS = [1, 2]@(base url with version identifier) ,我希望那些对象具有1-正,1-负,2-正或2-负)。

这是什么语法?

编辑-格式错误

2 个答案:

答案 0 :(得分:1)

在布尔查询中使用mustfilter

如果您使用must,则子查询将有助于得分,如果您使用filter,则不会。另外,如果您使用filter,elasticsearch将能够缓存结果。

{
    "bool": {
        "must": [
            {
                "nested": {
                    "path": "value_per_id",
                    "query": {
                        "terms": {
                            "value_per_id.value": <MY_VALUES>
                        }
                    }
                }
            },
            {
                "nested": {
                    "path": "value_per_id",
                    "query": {
                        "terms": {
                            "value_per_id.id": <MY_IDS>
                        }
                    }
                }
            }
        ]
    }
}

答案 1 :(得分:1)

您需要像这样在嵌套查询中使用布尔值:

{
    "query": {
        "bool": {
            "filter": [{
                "nested": {
                    "path": "value_per_id",
                    "query": {
                        "bool": {
                            "must": [
                                {"term": {"value_per_id.value": 1}},
                                {"term": {"value_per_id.id": 2}}
                            ]
                        }
                    }
                }
            }]
        }
    }
}