Найдите все записи в списке в Kibana с помощью запроса Elasticserach DSL

#elasticsearch #kibana #elasticsearch-dsl

Вопрос:

Не могли бы вы, пожалуйста, помочь мне в этом? Моя база данных Kibana в «Discover» содержит список сделок. Я знаю, что хочу найти все сделки в этой базе данных, которые были совершены по определенным инструментам (ISIN-Номер). Когда я добавляю фильтр вручную и переключаюсь на DSL запроса Elasticserach, я нахожу следующее:

 {
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "obdetails.isin": "CH0253592783"
          }
        },
        {
          "match_phrase": {
            "obdetails.isin": "CH0315622966"
          }
        },
        {
          "match_phrase": {
            "obdetails.isin": "CH0357659488"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}
 

Поскольку я хочу проверить базу данных на наличие более 200 ISIN, это кажется неэффективным. Есть ли способ, которым я мог бы просто сказать: «Покажите мне сделку, если она содержит один из следующих 200 ISIN?».

Я уже погуглил и попробовал это, но ничего не вышло:

 {
  "query": {
    "terms": {
      "obdetails.isin": [ "CH0357659488", "CH0315622966"],
      "boost": 1.0
    }
  }
}
 

Запрос работает, но не показывает никаких результатов.

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

1. Возможно, вам потребуется поделиться своим индексом, чтобы помочь прояснить проблему. Но я предполагаю, что ваше obdetails.isin поле-это анализируемое поле, которое может не работать с терминами, как предполагалось. Добавление поля типа keyword должно помочь.

2. Ты гений. Проблема решена. Высоко ценю!

Ответ №1:

Заключить. Анализируется поле типа text , которое в основном преобразует заданные данные в список терминов с использованием заданных анализаторов и т.д., А не в один термин. Данное поведение приводит к тому, что запрос терминов не соответствует этим значениям.

Вместо изменения типа поля можно добавить дополнительное поле типа keyword . Таким образом, запросы терминов могут выполняться, все еще имея возможность совпадать на поле.

 {
  "isin": {
    "type" "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}
 

В приведенном выше примере будет добавлено дополнительное вызываемое поле obdetails.isin.keyword , которое может использоваться для терминов. При этом все еще можно использовать запросы на соответствие obdetails.isin