Поиск по шаблону не работает в Кибане
У меня есть поле "Оповещение", которое содержит длинную строку, содержащую пробелы, числа и специальные символы. У меня есть это поле установлено "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*
даст тот же результат.