我在大型弹性搜索群集上运行以下查询。群集没有反应
{
"size": 10000,
"query": {
"bool": {
"must": [
{
"regexp": {
"message": {
"value": ".*exception.*"
}
}
},
{
"bool": {
"should": [
{
"term": {
"beat.hostname": "ip-xxx-xx-xx-xx"
}
}
]
}
},
{
"range": {
"@timestamp": {
"lt": 1518459660000,
"format": "epoch_millis",
"gte": 1518459600000
}
}
}
]
}
}
}
当我删除通配符.*exception.*
并将其替换为任何非通配字符串(如xyz
)时,它会快速返回。虽然查询使用通配符表达式,但它也会查找较小的时间范围和特定主机。我认为这是一个非常简单的查询。弹性搜索服务器无法处理此查询的任何原因?该集群有10个节点和20 TB的数据。
答案 0 :(得分:0)
请参阅documentation for Regexp Query。它清楚地说明了以下内容:
注意:正则表达式查询的性能很大程度上取决于常规 表达式选择。匹配像。*这样的一切非常慢
最理想的是使用WordDelimiterTokenFilter更改message
字段的文本分析,并将split_on_case_change
设置为true。然后NullPointerException
之类的内容将被编入索引为三个单独的标记[Null, Pointer, Exception]
。这可以帮助您在不使用正则表达式的情况下搜索exception
。警告你需要重新索引所有文件。
另一个快速尝试的方法可能是将过滤条件保留在filter context中的主机名和时间戳上,这将在运行regexp查询之前预先过滤文档。在您修复文本分析之前,这可能是一个短期解决方案。