首页 > 解决方案 > JSON在列表中时如何匹配?

问题描述

有些人像这样映射数据,

"item":[
        {"name":      "ABC" }
        {"brand":     "edf" },
        {"quantity":    12  }
       ]

我试图像这样过滤:

"filter":
     {"term": {"item.brand": "edf}}

然后我得到了这个结果:

    "hits": {
    "total": {
        "value": 0,
        "relation": "eq"
    },

我认识到这一点namebrand并被quantity置于[]

主要问题:我们可以在不改变映射方式的情况下过滤它吗?


#实际情况:

"item": {
   "categories": [
                     {"deleted_at": null,
                      "description": {
                         "en": "Bun ",
                         "vi": "Bánh Bao "
                                     }
                      },
               ....
                  ]
        }

我的查询:

["filter":
{"nested": {"path":"item.categories",
        "query":{
                 "term":{"item.categories.description.en":"Bun "}
                }
       }
 }
 ]

得到这个错误:

"failed to create query: [nested] nested object under path [item.categories] is not of nested type",

标签: elasticsearch

解决方案


可能item是嵌套类型,如果是这种情况,您需要使用nested如下查询进行查询:

{
  "query": {
    "bool": {
      "filter": {
        "nested": {
          "path": "item",
          "query": {
            "term": {
              "item.brand": "edf"
            }
          }
        }
      }
    }
  }
}

更新

根据你得到的错误,item.categories不是嵌套的,所以你的初始查询是正确的。但是,您应该使用match而不是term,如下所示:

{
  "query": {
    "bool": {
      "filter": {
        "match": {
          "item.categories.description.en": "Bun"
        }
      }
    }
  }
}

推荐阅读