我将Tomcat的日志存储在ElasticSearch服务中。日志colud有超过5k个字符。当我仅通过时间戳搜索时,搜索以毫秒结束。当指数计数很短时,搜索速度很快,但现在指数的数量大约是37万,而整个短语的搜索需要花费很多时间。我尝试在结果中使用filter或post_filter并搜索短语,但它需要相同的时间段。 我使用了关键字标记符,因为我想在logLines中搜索带有“/”等特殊字符的整个短语。如何改进查询或映射以加快搜索速度?
编辑:
我认为它可以先按文本搜索而不是按日期过滤,因为如果日志计数很短,并且时间戳之间的日志数相同,则搜索速度非常快。现在它获得相同数量的日志,并且非常慢。即使我使用了post_filter。
这是我的映射:
{
"settings": {
"analysis": {
"analyzer": {
"logs_string_analyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"tokenizer": "keyword"
}
}
}
},
"mappings": {
"log": {
"properties": {
"level": {
"type": "long"
},
"logLines": {
"type": "text",
"analyzer": "logs_string_analyzer"
},
"timestamp": {
"type": "long"
}
}
}
}
}
这是我的疑问:
{
"size" : 30,
"query" : {
"bool" : {
"must" : [
{
"wildcard" : {
"logLines" : {
"wildcard" : "*XYZ*",
"boost" : 1.0
}
}
},
{
"range" : {
"timestamp" : {
"from" : null,
"to" : 1495705598305,
"include_lower" : true,
"include_upper" : true,
"boost" : 2.0
}
}
},
{
"range" : {
"timestamp" : {
"from" : 1495705501496,
"to" : null,
"include_lower" : false,
"include_upper" : true,
"boost" : 2.0
}
}
}
]
}
},
"sort" : [
{
"timestamp" : {
"order" : "desc"
}
}
]
}
使用post_filtter和query_string而不是通配符进行查询:
{
"query": {
"bool": {
"must": [
{
"range": {
"timestamp": {
"from": null,
"to": 1495705598305,
"include_lower": true,
"include_upper": true,
"boost": 2
}
}
},
{
"range": {
"timestamp": {
"from": 1495705501496,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 2
}
}
}
]
}
},
"post_filter": {
"query_string": {
"default_field": "logLines",
"query": "*XYZ*"
}
}
}