elasticsearch - 如何减少ES中的多个条件

标签 elasticsearch

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

关于elasticsearch - 如何减少ES中的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60206511/

相关文章:

elasticsearch - 为什么我不能通过环回连接到elasticsearch?

elasticsearch - 如何排除journalbeat中的日志/事件

elasticsearch - 无法访问 ElasticSearch 聚合脚本中的 doc ['field' .value

elasticsearch - Elasticsearch:按字段排序,最后带有custom_null值

elasticsearch - 在 logstash.conf 文件中加密/保护 Elasticsearch 的密码

elasticsearch - 每日奇迹指数-删除安全吗?

elasticsearch - ElasticSearch-使用相同的字段名称但使用不同的分析器搜索不同的doc_types

elasticsearch - 我可以通过聚合获得干净的数据结构吗

java - ElasticSearch Java Boost 上线日期

elasticsearch - 渗滤未按预期返回结果