Фильтровать записи из вложенного запроса - Elastic Search - PullRequest
1 голос
/ 05 июня 2019

У меня есть вложенные поля массива, мне нужно запросить и отфильтровать записи для этого. Пример

"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 Ответ

1 голос
/ 05 июня 2019

Исходя из ваших дальнейших разъяснений, следующий код должен вам помочь:

Решение:

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"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }  
}

Приведенное выше решение вернет вам все документы, имеющие name как ranjith ИЛИ, если name равно vanaraj и age > 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
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

Пожалуйста, запустите выше и дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...