Поиск по шаблону не работает в Кибане

У меня есть поле "Оповещение", которое содержит длинную строку, содержащую пробелы, числа и специальные символы. У меня есть это поле установлено "not_analyzed". Используя подстановочный запрос, я могу выполнить запрос следующим образом и получить желаемые результаты.

POST /test-index-snort2/type-snort/_search
{
  "query": {
    "wildcard": {
      "Alert": {
        "value": "ET CNC*"
      }
    }
  }
}

Я хотел бы использовать Kibana для реализации подобного поиска. Однако это не даст результатов. Мой запрос в Кибане выглядит следующим образом:

Alert:"ET CNC*"

Что, в свою очередь, создает запрос query_string примерно так:

"query": {
    "filtered": {
      "query": {
        "bool": {
          "should": [
            {
              "query_string": {
                "query": "Alert:\"ET CNC*\""
              }
            }
          ]
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "match_all": {}
            }
          ]
        }
      }
    }

Есть ли способ получить те же результаты в Kibana через запрос query_string, что я делаю с использованием запроса с подстановочными знаками?

Вот сопоставление для поля Alert и пример записей:

"Alert": {
        "type": "string",
        "index": "not_analyzed"
},

"Alert": "ET CNC Palevo Tracker Reported CnC Server TCP group 9 ",
"Alert": "ET CNC Palevo Tracker Reported CnC Server TCP group 10 ",
"Alert": "ET CNC Zeus Tracker Reported CnC Server TCP group 3 ",

Ответы

Ответ 1

Благодаря полифракталу в #elasticsearch у меня есть ответ. По умолчанию query_string будет вводить подстановочный знак нижнего регистра. Это можно отключить с помощью параметра lowercase_expanded_terms = false. Однако нет никакого способа установить это в Кибане.

polyfractal рекомендовал, чтобы я создавал анализатор для ввода этого содержимого в нижний регистр. Это позволит мне использовать query_string с подстановочными знаками с ограничением на то, что значение поля будет отображаться в нижнем регистре в результатах грани, но источник будет сохранять исходное форматирование. Для меня это хорошо работает и является решением, с которым я продвигаюсь вперед.

За исключением IRC:

<polyfractal> id set up the analyzer like this:  tokenizer:keyword, filters: [lowercase]
<polyfractal> that'll basically give you a lowercased `not_analyzed` field.  may also want to disable norms, since you prolly dont need them either

Ответ 2

Try

{"wildcard":{"Alert":"ET CNC*"}}

в строке поиска. вы получите ожидаемый формат в query_string.

Ответ 3

В соответствующей заметке я смог получить lowercase_expanded_terms в кибане, работающей с этим изменением:

diff --git a/src/app/services/querySrv.js b/src/app/services/querySrv.js
index 72e5d8b..160285c 100644
--- a/src/app/services/querySrv.js
+++ b/src/app/services/querySrv.js
@@ -102,7 +102,7 @@ function (angular, _, config, kbn) {
               .size(q.size)
               .facetFilter(ejs.QueryFilter(
                 ejs.FilteredQuery(
-                  ejs.QueryStringQuery(q.query || '*'),
+                  ejs.QueryStringQuery(q.query || '*').lowercaseExpandedTerms(false),
                   filterSrv.getBoolFilter(filterSrv.ids())
                   )))).size(0);

@@ -206,7 +206,7 @@ function (angular, _, config, kbn) {
       switch(q.type)
       {
       case 'lucene':
-        return ejs.QueryStringQuery(q.query || '*');
+        return ejs.QueryStringQuery(q.query || '*').lowercaseExpandedTerms(false);
       case 'regex':
         return ejs.RegexpQuery('_all',q.query);
       default:
@@ -281,4 +281,4 @@ function (angular, _, config, kbn) {
     self.init();
   });

Ответ 4

Я не вижу здесь самый простой ответ, этот:

Если вы укажете Alert:"ET CNC*" в строке поиска Kibana, он действительно не даст никакого результата,

НО

Если вы отбросите кавычки, подстановочный поиск будет работать и в фильтре lucen. Теперь, конечно, в вашем случае пробел в поисковом запросе проблематичен, но с учетом вашего Alert: ET*CNC* набора данных Alert: ET*CNC* даст тот же результат.