Фильтры с динамическими полями в elasticsearch

Я переключаю очень старую версию ElasticSearch на версию 6.5.

...  
  "text_mined_entities": {
            "nlp": {
                "abbreviations": [],
                "chunks": [],
                "recurring_chunks": [],
                "tagged_entities_grouped": {
                    "NEURO|SCICRUNCH": [
                        {
                            "category": "NEURO",
                            "end": 41,
                            "label": "Infant",
                            "match": "infant",
                            "original_value": "Infant",
                            "reference": "BIRNLEX695",
                            "reference_db": "SCICRUNCH",
                            "sentence": 0,
                            "start": 35
                        },
...

Я хочу отфильтровать поля text_mined_entities.nlp.tagged_entities_grouped.*.reference (которые хранятся как «ключевое слово»), но мне не повезло. Что-то типа:

GET _search
{
  "query": {
    "bool": {
      "filter": { "term": {
        "text_mined_entities.nlp.tagged_entities_grouped.*.reference": "BIRNLEX695"

      }}

    }
  }
}

Какие-либо предложения? Спасибо.


person fitz    schedule 24.11.2018    source источник


Ответы (1)


Подстановочные знаки в полях нельзя применять к термину запроса. Вместо этого вы можете использовать query_string, который также поддерживает подстановочные знаки в поле. Итак, будет работать следующее:

Предполагая, что text_mined_entities и nlp имеют тип nested

{
  "query": {
    "nested": {
      "path": "text_mined_entities.nlp",
      "query": {
        "query_string": {
          "query": "BIRNLEX695",
          "fields": [
            "text_mined_entities.nlp.tagged_entities_grouped.*.reference"
          ]
        }
      }
    }
  }
}

Обновить (если text_mined_entities и nlp имеют тип object, а не nested):

{
  "query": {
    "query_string": {
      "query": "BIRNLEX695",
      "fields": [
        "text_mined_entities.nlp.tagged_entities_grouped.*.reference"
      ]
    }
  }
}
person Nishant    schedule 25.11.2018
comment
Спасибо! Я изменил свое сопоставление, чтобы оно было вложенным как для text_mined_entities, так и для nlp (ранее они были объектами), и этот запрос работает. Однако возможно ли в сопоставлении индексировать только поле «ссылка»? Похоже, что установка этого как вложенного приводит к тому, что размер индекса немного увеличивается. - person fitz; 25.11.2018
comment
Я добавил обновление с запросом, который должен работать, если поля имеют тип object. Что касается возможности индексировать только поле reference с помощью сопоставления, см. динамическое отображение. Отключение динамического сопоставления может помочь, если сопоставление известно и не обновляется слишком часто. - person Nishant; 25.11.2018