Эластичная агрегация поисковых запросов

#python #sql #elasticsearch #kibana #elk

#python #sql #эластичный поиск #kibana #elk

Вопрос:

Я пишу скрипт на python для получения уникальных значений в индексе elasticsearch. Я использую агрегацию терминов для получения уникальных значений и их количества. Однако, когда я передаю список полей в скрипт, я понял, что некоторые из полей хранятся как

 "abc" : {
            "type" : "keyword"
        }
  

и некоторые из них хранятся как

 "xyz" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword"
              }
            }
          }
  

Во время агрегации терминов я использую запрос

 {
    "aggs" : {
        "abc" : {
            "terms" : {
                "field" : "abc"
            }
        }
    }, "size":0
}
  

Но когда этот запрос используется в «xyz», он выдает ошибку Fielddata is disabled on text fields by default. Set fielddata=true on [description] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.

Чтобы выполнить запрос для «xyz», мне нужно добавить к нему «.keyword», но тогда «abc» не будет выполняться.

Есть ли какой-либо способ, которым я могу проверить, какое поле принадлежит какому типу, а затем с помощью if / else соответствующим образом обновить запрос?

Ответ №1:

У вас может быть и то, и другое — поле, которое может быть агрегируемым и доступным для поиска без .keyword обозначения. Просто настройте свое сопоставление в соответствии с сообщением об ошибке:

 "xyz" : {
   "type" : "text",
   "fielddata": true
}
  

затем переиндексируйте, и все готово.

Что касается того, есть ли проверка во время запроса, чтобы определить, какие поля являются какими, — их нет. Одним из основных принципов ElasticSearch является то, что типы полей предопределены и определены таким образом, чтобы они индексировались соответствующим образом, чтобы поиск / агрегации были оптимизированы. Таким образом, предполагается, что во время запроса вы знаете, какие поля какого типа.

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

1. Привет, Джо, спасибо за твой ответ. Однако я не могу изменить структуру индекса. Вот почему я ищу решения, в которых я могу сравнивать.

2. Правильно. Затем посмотрите GET your_index_name/_mapping , где хранятся определения всех этих полей. Создавайте свои запросы соответствующим образом.

3. Конечно. Дайте мне знать, как все прошло.