在下面的查询中,我多次使用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"
             }
          }
       ]
    }

谢谢!

最佳答案

首先,您可以将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(请参阅Elastic Documentation)或Logstash。例如,您可以在索引时间评估must_not条件,并将结果设置为 bool(boolean) 字段(例如ignore),然后将其添加到所有文档中,以便可以在查询时将该字段用于以下查询:
"query":{
  "bool":{
    "filter":[{
      "range":{
        "@timestamp":{
          "gte":"2020-02-10T11:13:19.7684961Z",
          "lte":"2020-02-11T11:13:19.7684961Z"
        }
      }
    },
    {
      "match": {
        "ignore": false
      }
    },
    ...

08-28 03:03