Kibana 6 объединяет 2 фильтра

#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 , и с моей стороны это отлично работает. В том числе с помощью скрипта. Не могли бы вы попытаться изолировать проблему, используя basic match с range.keyword , а также с другими полями, и посмотреть, работает ли это в Edit Query DSL . Также удалите "type": "phrase" в первом полученном запросе. Проверьте, возвращают ли сначала оба запроса ответ через Kibana, а затем объедините их.