elasticsearch嵌套查询,多个对象应满足条件

时间:2018-12-29 09:39:44

标签: elasticsearch nested

我对嵌套查询有一些疑问。 这是我的例子。映射为{"user":"nested"}。现有数据如下:

{
  "user": [
    {
      "first":"John",
      "last":"Smith"
    },
    {
      "first":"Alice",
      "last":"White"
    }
  ]
}

如何创建查询来查找符合所有条件的文档:

  1. 用户的第一个对象,其“第一个”是“ John”,“ last”是“ Smith”;
  2. 用户的第二个对象,其“第一个”是“爱丽丝”,“最后一个”是“白色”

3 个答案:

答案 0 :(得分:0)

尝试以下查询:

{  
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "bool":{  
                  "must":[  
                     {  
                        "bool":{  
                           "must":[  
                              {  
                                 "nested":{  
                                    "query":{  
                                       "bool":{  
                                          "must":[  
                                             {  
                                                "match_phrase":{  
                                                   "user.first":{  
                                                      "query":"John"
                                                   }
                                                }
                                             },
                                             {  
                                                "match_phrase":{  
                                                   "user.last":{  
                                                      "query":"Smith"
                                                   }
                                                }
                                             }
                                          ]
                                       }
                                    },
                                    "path":"user"
                                 }
                              },
                              {  
                                 "nested":{  
                                    "query":{  
                                       "bool":{  
                                          "must":[  
                                             {  
                                                "match_phrase":{  
                                                   "user.first":{  
                                                      "query":"Alice"
                                                   }
                                                }
                                             },
                                             {  
                                                "match_phrase":{  
                                                   "user.last":{  
                                                      "query":"White"
                                                   }
                                                }
                                             }
                                          ]
                                       }
                                    },
                                    "path":"user"
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

答案 1 :(得分:0)

下面的查询是您要寻找的。您只需要有两个nested queries,并使用bool子句组合到一个must中,就可以满足您提到的每个条件。

请注意,我假设字段user.firstuser.last是具有type的文本standard analyzer

POST <your_index_name>
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "nested":{  
                  "path":"user",
                  "query":{  
                     "bool":{  
                        "must":[  
                           {  
                              "match":{  
                                 "user.first":"john"
                              }
                           },
                           {  
                              "match":{  
                                 "user.last":"smith"
                              }
                           }
                        ]
                     }
                  }
               }
            },
            {  
               "nested":{  
                  "path":"user",
                  "query":{  
                     "bool":{  
                        "must":[  
                           {  
                              "match":{  
                                 "user.first":"alice"
                              }
                           },
                           {  
                              "match":{  
                                 "user.last":"white"
                              }
                           }
                        ]
                     }
                  }
               }
            }
         ]
      }
   }
}

希望这会有所帮助!

答案 2 :(得分:0)

答案是:

{
    "query": {
        "bool": {
            "must": [
                {
                    "has_parent": {
                        "parent_type": "doc",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "terms": {
                                            "id": [
                                                713
                                            ]
                                        }
                                    },
                                    {
                                        "range": {
                                            "created": {
                                                "lte": "now/d"
                                            }
                                        }
                                    },
                                    {
                                        "range": {
                                            "expires": {
                                                "gte": "now/d"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "nested": {
                        "path": "prices",
                        "query": {
                            "bool": {
                                "filter": [
                                    {
                                        "term": {
                                            "prices.id_prcknd": 167
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                {
                    "term": {
                        "doc_type": "item"
                    }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "have_prices": true
                                }
                            },
                            {
                                "term": {
                                    "is_folder": true
                                }
                            }
                        ]
                    }
                }
            ],
            "must_not": {
                "exists": {
                    "field": "folder"
                }
            }
        }
    },
    "sort": [
        {
            "is_folder": {
                "order": "desc"
            }
        },
        {
            "title_low.order": {
                "order": "asc"
            }
        }
    ],
    "size": 1000
}