Как уменьшить несколько условий в ES - PullRequest
0 голосов
/ 13 февраля 2020

В приведенном ниже запросе я несколько раз использовал match_phrase. как уменьшить несколько match_phrase? потому что в процессе производства при запросах к ES ответ очень медленный.

  GET /logs*/_search
    {
       "from":0,
       "query":{
          "bool":{
             "filter":[
                {
                   "range":{
                      "@timestamp":{
                         "gte":"2020-02-10T11:13:19.7684961Z",
                         "lte":"2020-02-11T11:13:19.7684961Z"
                      }
                   }
                }
             ],
             "must":[
                {
                   "bool":{
                      "must_not":[
                         {
                            "match_phrase":{
                               "message":{
                                  "query":"System32"
                               }
                            }
                         },

                         {
                            "match_phrase":{
                               "message":{
                                  "query":"212.118.14.45"
                               }
                            }
                         },

                         {
                            "match_phrase":{
                               "message":{
                                  "query":"  stopped state."
                               }
                            }
                         },
                         {
                            "match_phrase":{
                               "message":{
                                  "query":"  running state"
                               }
                            }
                         },
                         {
                            "match_phrase":{
                               "message":{
                                  "query":"  Share Name: \\\\*\\DLO-EBackup"
                               }
                            }
                         }
                         .
                         .
                         .
                         etc.,
                         .
                         .
                         .
                         .
                         .
                         {
                            "match_phrase":{
                               "message":{
                                  "query":"WFO15Installation"
                               }
                            }
                         },
                         {
                            "match_phrase":{
                               "message":{
                                  "query":"Windows\\SysWOW64"
                               }
                            }
                         },
                         {
                            "match_phrase":{
                               "message":{
                                  "query":"Bitvise"
                               }
                            }
                         }
                      ]
                   }
                }
             ]
          }
       },
       "size":10,
       "sort":[
          {
             "@timestamp":{
                "order":"desc"
             }
          }
       ]  
    }

Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2020
Для начала

вы можете переместить блок 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
      }
    },
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...