我在一个大型的弹性搜索集群上运行下面的查询。群集没有响应
{
"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 )时,它返回得很快。尽管查询使用通配符表达式,但它也会查找较小的时间范围和特定的主机。我认为这是一个非常简单的查询。为什么elasticsearch服务器不能处理这个查询?该集群有10个节点和20 TB的数据。
发布于 2018-02-14 23:17:26
请参阅documentation for Regexp Query。它清楚地说明了以下几点:
注意:正则表达式查询的性能在很大程度上取决于所选择的正则表达式。像.*这样的东西都匹配起来非常慢
理想的做法是使用WordDelimiterTokenFilter更改message字段上的文本分析,并将split_on_case_change设置为true。然后,像NullPointerException这样的东西将被索引为三个单独的令牌[Null, Pointer, Exception]。这可以帮助您在不使用正则表达式的情况下在exception上搜索。需要注意的是,您需要对所有文档重新编制索引。
另一件快速尝试的事情可能是在filter context中保留对主机名和时间戳的过滤条件,这将在运行regexp查询之前对文档进行预过滤。在你修复文本分析之前,这可能是一个短期的解决方案。
https://stackoverflow.com/questions/48780372
复制相似问题