#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. Конечно. Дайте мне знать, как все прошло.