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