如何过滤Elasticsearch索引?匹配log$org$*格式遇阻求助
Elasticsearch 6 索引匹配含
$符号的问题解决 问题背景
现有索引列表:
log$org$2018 log$org$2019_v2 log$org$2021_v5 log$org$2019 log$org_test$2020_v3 log$org_test$2019_v2 log$org_test$2021_v5 log$org$2019_v3
需筛选出仅以log$org$开头的索引,目标保留集合:
log$org$2018 log$org$2019_v2 log$org$2021_v5 log$org$2019 log$org$2019_v3
使用Elasticsearch 6的indices.get方法传入log$org$*作为索引参数时,返回结果为None。执行代码如下:
from elasticsearch6 import Elasticsearch elasticsearch = Elasticsearch() elasticsearch.indices.get(index=f"log$org$*")
请求日志显示:
Starting new HTTP connection (1): elasticsearch:9200 elasticsearch:9200 "GET /log%24org%24* HTTP/1.1" 200 2 GET elasticsearch:9200/log%24org%24* [status:200 request:0.010s] > None
问题原因
$在Elasticsearch的索引模式匹配中是特殊字符(默认用作正则表达式的行尾匹配符),直接传入log$org$*时,Elasticsearch会将$解析为正则符号,而非索引名称中的字面量,导致无法匹配到目标索引。
解决方案
1. 正确转义$字符
在Python中,需通过双重转义让Elasticsearch识别字面量$:使用\\$(Python解析后传递给Elasticsearch的是\$,这是Elasticsearch认可的字面$转义符),同时推荐使用原始字符串避免Python额外解析转义:
from elasticsearch6 import Elasticsearch elasticsearch = Elasticsearch() # 用原始字符串+\\$转义$,匹配log$org$开头的所有索引 target_indices = elasticsearch.indices.get(index=r"log\$org\$*") print(target_indices)
2. 直接传入URL编码后的字符串(可读性差,不推荐)
由于请求中$会被自动编码为%24,也可以直接传入编码后的索引模式:
target_indices = elasticsearch.indices.get(index="log%24org%24*")
验证效果
转义后的模式log\$org\$*会精确匹配所有以log$org$开头的索引,自动过滤log$org_test$开头的非目标索引,返回结果即为需求中的目标集合。
内容的提问来源于stack exchange,提问作者Tomer
相关产品推荐
相关产品推荐

