#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