从嵌套查询中过滤记录-Elastic Search

时间:2019-06-05 09:14:44

标签: elasticsearch

我有嵌套的数组字段,因此需要查询和过滤记录。 样本

"test":{
  "name":[
     {
       "name": "vanaraj",
       "Age" : 26
     },
     {
       "name": "vanaraj",
       "Age" : 10
     },
     {
       "name": "ranjit",
       "Age" : 26
     },

    ]

}

在这里,我如何查询以下情况,   1.如果Name等于[[“ vanaraj”,“ ranjit”],则要提取   2.添加条件,其中年龄> 25仅适用于“ vanaraj”

我需要一个类似下面的查询,但是它不起作用。

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "data.test.name",
            "query": {
              "bool": {
                "filter": [
                  {
                    "terms": {
                      "data.test.name.name": ["vanaraj","ranjit"]
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "data.test.name",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {
                      "data.test.name.name": "vanaraj"
                    }
                  },
                  {
                    "range": {
                       "data.test.name.Age": {
                                            "gt": 25
                        }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

映射:

{  
   "mappings":{  
      "properties":{  
         "test":{  
            "properties":{  
               "name":{  
                  "type":"nested",               
                  "properties":{  
                     "Age":{  
                        "type":"long"
                     },
                     "name":{  
                        "type":"text",
                        "fields":{  
                           "keyword":{  
                              "type":"keyword",
                              "ignore_above":256
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
}

1 个答案:

答案 0 :(得分:1)

根据您的进一步说明,以下代码应为您提供帮助:

解决方案:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "test.name",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "test.name.name": "vanaraj"
                    }
                  },
                  {
                    "range": {
                      "test.name.Age": {
                        "gte": 26
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "test.name",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "test.name.name": "ranjith"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }  
}

以上解决方案将返回所有nameranjith的文档,或者如果namevanarajage > 25

查询摘要:

Bool 
 - Should
    - Must clause for name=vanaraj and age >= 26
    - Must clause for name=ranjith

更新的解决方案:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "test.name",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "test.name.name": "vanaraj"
                    }
                  },
                  {
                    "range": {
                      "test.name.Age": {
                        "gte": 26
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "test.name",
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "test.name.name": [
                        "abc",
                        "ranjit"
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "must_not": [
      {
          "nested": {
            "path": "test.name",
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "test.name.name": [
                        "vanaraj"
                      ]
                    }
                  },{
                    "range": {
                      "test.name.Age": {
                        "lte": 25
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

请运行上面的命令,让我知道是否有帮助!