代码之家  ›  专栏  ›  技术社区  ›  Yavuz

修复简单的Elasticsearch查询

  •  1
  • Yavuz  · 技术社区  · 7 年前

    我有以下数据:

    {
       "results":[
          {
             "ID":"1",
             "products":[
                {
                   "product":"car",
                   "number":"5"
                },
                {
                   "product":"computer",
                   "number":"212"
                }
             ]
          },
          {
             "ID":"2",
             "products":[
                {
                   "product":"car",
                   "number":"9"
                },
                {
                   "product":"computer",
                   "number":"463"
                },
                {
                   "product":"bicycle",
                   "number":"5"
                }
             ]
          }
       ]
    }
    

    我的问题如下:

    {  
       "query":{  
          "bool":{  
             "must":[  
                {  
                   "wildcard":{  
                      "results.products.product":"*car*"
                   }
                },
                {  
                   "wildcard":{  
                      "results.products.number":"*5*"
                   }
                }
             ]
          }
       }
    }
    

    我所期望的是只得到ID1。因为只有它有一个带有{“product”:“car”,“number”:“5”}记录的产品。但我得到的是ID1和ID2,因为ID2的第一条记录有“product”:“car”,第三条记录有“number”:“5”条记录。

    如何修复此查询?

    1 回复  |  直到 7 年前
        1
  •  3
  •   mickl    7 年前

    您需要将您的产品定义为 nested type 创建映射时。尝试以下映射示例:

    PUT http://localhost:9200/indexname
    
    {
      "mappings": {
         "typename": {
            "properties": {
               "products" : {
                  "type" : "nested"
                }
              }
           }
        }
     }
    

    然后,您可以使用嵌套查询来匹配数组的整个元素,就像您需要的那样。

    {
      "query": {
        "nested": {
          "path": "products",
          "query": {
            "bool": {
              "must": [
                { "wildcard": { "products.product": "*car*" }},
                { "wildcard": { "products.number":  "*5*" }} 
              ]
            }
          }
        }
      }
    }