Для начала
вы можете переместить блок must_not
внутрь блока filter
, чтобы пропустить вычисление баллов и использовать некоторое кеширование. Что-то вроде:
"query":{
"bool":{
"filter":[{
"range":{
"@timestamp":{
"gte":"2020-02-10T11:13:19.7684961Z",
"lte":"2020-02-11T11:13:19.7684961Z"
}
}
},
{
"bool": {
"must_not":[{
"match_phrase":{
"message":{
"query":"System32"
}
}
},
{
"match_phrase":{
"message":{
"query":"212.118.14.45"
}
}
},
...
]
}
}],
...
Однако, как уже упоминалось в комментариях, вам следует оптимизировать свои данные для поиска перед индексацией документов в Elasticsearch. Лучшим решением, чем использование большого количества фильтров в запросе, было бы обработать ваши данные и применить эти фильтры во время приема, например, с помощью API загрузки (см. Elasti c Документация ) или Logsta * 1013. *. Например, вы можете оценить условия must_not
во время индекса и установить результат в логическое поле (например, ignore
), которое вы можете добавить ко всем документам, чтобы вы могли использовать это поле во время запроса с запросом, подобным это:
"query":{
"bool":{
"filter":[{
"range":{
"@timestamp":{
"gte":"2020-02-10T11:13:19.7684961Z",
"lte":"2020-02-11T11:13:19.7684961Z"
}
}
},
{
"match": {
"ignore": false
}
},
...