Запрос вложенного пути Elasticsearch в тип объекта

#elasticsearch #elasticsearch-dsl

#elasticsearch #elasticsearch-dsl

Вопрос:

Наличие этого шаблона (сокращенная версия).

 {
  "index_patterns": "index_pattern*",
  "order": 1,
  "version": 1,
  "aliases": {
    "some_alias": {}
  },
  "settings": {
    "number_of_shards": 5,
  },
  "mappings": {
    "dynamic": "false",
    "properties": {
      "someId": {
        "type": "keyword"
      },
      "audience": {
        "type": "object",
        "properties": {
          ....
          "ageRanges": {
            "type": "nested",
            "properties": {
              "ageTo": {
                "type": "integer"
              },
              "ageFrom": {
                "type": "integer"
              }
            }
          }
        }
      }
    }
  }
}
 

Мне нужно запросить, audience.ageRanges не существует ли он, или, если он существует, применить другие фильтры.

Допустим, мы хотим выполнить поиск, если документ с определенным someId значением вписывается в audience.ageRanges предложения запроса (удалено для ясности). У него есть некоторые свойства аудитории, но нет ageRanges .

 "audience": {
  "genders": [
    "any"
  ],
  "deviceType": "any"
}
 

Разве приведенный ниже запрос не должен возвращать конкретный документ?

 {
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "someId": {
                            "value": "03183f31"
                        }
                    }
                },
                {
                    "nested": {
                        "path": "audience.ageRanges",
                        "query": {
                            "bool": {
                                "must_not": [
                                    {
                                        "exists": {
                                            "field": "audience.ageRanges"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}
 

Мои результаты равны 0, это немного сбивает с толку, как это работает.

Попытка с идентификатором документа, в котором есть audience.ageRanges элементы, и изменение must_not вложенного запроса на must вернет результаты.

Ответ №1:

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

Рассмотрим образец данных индекса как

 {
  "someId":123,
  "audience": {
    "genders": [
      "any"
    ],
    "deviceType": "any"
  }
}
 

Вам необходимо изменить свой поисковый запрос, как показано ниже —

Поисковый запрос:

 {
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "someId": {
              "value": "123"
            }
          }
        },
        {
          "bool": {
            "must_not": {
              "nested": {
                "path": "audience.ageRanges",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "exists": {
                          "field": "audience.ageRanges"
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}
 

Результат поиска:

 "hits": [
      {
        "_index": "65852173",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "someId": 123,
          "audience": {
            "genders": [
              "any"
            ],
            "deviceType": "any"
          }
        }
      }
    ]
 

Комментарии:

1. @Джордж Таскос у вас была возможность ознакомиться с ответом, с нетерпением жду обратной связи от вас 🙂