#elasticsearch #kibana #kibana-6
#elasticsearch #kibana #kibana-6
Вопрос:
У меня есть 2 фильтра, которые хорошо работают: 1. Соответствует фразе «NA»
{
"query": {
"match": {
"region.keyword": {
"query": "NA",
"type": "phrase"
}
}
}
}
2. Использует скриптовое поле, которое извлекает фильтры для отображения всех часов, отличных от 0-7:
{
"script": {
"script": {
"inline": "boolean gte(Supplier s, def v) {return s.get() >= v} boolean lt(Supplier s, def v) {return s.get() < v}gte(() -> { doc['@timestamp'].date.hourOfDay }, params.gte) amp;amp; lt(() -> { doc['@timestamp'].date.hourOfDay }, params.lt)",
"params": {
"gte": 0,
"lt": 7,
"value": ">=0 <7"
},
"lang": "painless"
}
}
}
Я хотел бы сгруппировать это в один фильтр, чтобы его «часы NA не находились в диапазоне 0-7», таким образом, я могу изменить регион и время и по-прежнему применять дополнительные фильтры.
Также не уверен, как добавить этот пользовательский фильтр, поскольку добавление фильтра позволяет мне вводить только 1 поле
Ответ №1:
Прежде чем использовать визуализаторы и discover, убедитесь, что вы создали шаблон индекса в Management -> Index Pattern -> Create index pattern
` и добавили название индекса, к которому вы будете применять фильтры.
Теперь, объединив запросы, которые вы добавили в вопросе, объединенный запрос будет выглядеть примерно так, как показано ниже:
{
"query": {
"bool": {
"must": [
{
"region.keyword": {
"query": "NA",
"type": "phrase"
}
},
{
"script": {
"script": {
"inline": "boolean gte(Supplier s, def v) {return s.get() >= v} boolean lt(Supplier s, def v) {return s.get() < v}gte(() -> { doc['@timestamp'].date.hourOfDay }, params.gte) amp;amp; lt(() -> { doc['@timestamp'].date.hourOfDay }, params.lt)",
"params": {
"gte": 0,
"lt": 7,
"value": ">=0 <7"
},
"lang": "painless"
}
}
}
]
}
}
}
Раздел поиска
В разделе Kibana «Открытие» выберите название индекса в index pattern section
(обратитесь к ссылке для изображения), а затем нажмите Add a filter
, там в правой части вы увидите опцию Edit Query DSL
.
Скопируйте и вставьте приведенный выше запрос. Вы должны быть в состоянии видеть результаты в Document Table
, то есть сведения о документе под графиком.
Визуализатор
Ну, вы не упомянули в вопросе, связано ли это с конкретным визуализатором (или вкладкой discover), однако точно так же, как мы добавили фильтр в раздел discover, вы можете сделать это и в визуализаторах (скажем, например, в Metric Visualizer
где вы увидите Edit Query DSL
раздел под Add a filter
)
Дайте мне знать, если это поможет!
Комментарии:
1. Это довольно полезно, хотя я получил эту ошибку ` [parsing_exception] нет [запроса], зарегистрированного для [региона. ключевое слово], с { line =1 amp; col = 646 }` что странно, потому что оно отлично работает, когда скрипт не присоединен. Я нашел регион. ключевое слово просто отлично.
2. @chowpay, я пробовал использовать пример сопоставления и использовал его
field.keyword
, и с моей стороны это отлично работает. В том числе с помощью скрипта. Не могли бы вы попытаться изолировать проблему, используя basicmatch
сrange.keyword
, а также с другими полями, и посмотреть, работает ли это вEdit Query DSL
. Также удалите"type": "phrase"
в первом полученном запросе. Проверьте, возвращают ли сначала оба запроса ответ через Kibana, а затем объедините их.