Elasticsearch查询名称与特定模式匹配的索引



我的Elasticsearch数据库中有几个索引,如下

Index_2019_01
Index_2019_02
Index_2019_03
Index_2019_04
.
.
Index_2019_12

假设我只想搜索前3个索引。我指的是这样的正则表达式:

select count(*) from Index_2019_0[1-3] where LanguageId="English"

在Elasticsearch中,正确的方法是什么?

在不添加任何额外数据的情况下,为什么要使用POST。我建议您使用GET。其次,如果索引的名称与您的情况类似,那么您应该使用以下查询中的索引模式

GET /index_2019_*/_search
{
"query": {
"match": {
"LanguageID": "English"
}
}
}

URL 中的OR

curl -XGET "http://<host>:<port>/index_2019_*/_search" -H 'Content-Type: application/json' -d'{"query": {"match":{"LanguageID": "English"}}}'

如何查询具有特定名称的多个索引

这可以通过多索引搜索来实现,这是Elasticsearch的内置功能。为了实现所描述的行为,应该尝试这样的查询:

POST /index_2019_01,index_2019_02/_search
{
"query": {
"match": {
"LanguageID": "English"
}
}
}

或者,使用URI搜索:

curl 'http://<host>:<port>/index_2019_01,index_2019_02/_search?q=LanguageID:English'

更多详细信息请点击此处。请注意,Elasticsearch要求索引名称必须小写。

我可以使用正则表达式指定索引名称模式吗

简而言之,没有。可以在使用特殊"虚拟"字段_index的查询中使用索引名称,但其使用受到限制。例如,不能对索引名称使用regexp:

索引作为虚拟字段公开—它不会添加到Lucene索引作为一个实字段。这意味着您可以使用_index一个或多个术语查询(或任何重写为术语查询,如匹配、query_string或simple_query_stringquery),但它不支持前缀、通配符、regexp或模糊查询。

例如,上面的查询可以重写为:

POST /_search
{
"query": {
"bool": {
"must": [
{
"terms": {
"_index": [
"index_2019_01",
"index_2019_02"
]
}
},
{
"match": {
"LanguageID": "English"
}
}
]
}
}
}

它使用bool和terms查询。

希望能有所帮助!

虽然使用正则表达式搜索索引是不可能的,但您可以使用日期数学来进一步了解。

你可以在这里查看文档

举个例子,假设你希望这些指数的最后3个月这意味着如果我们index_2019_01
index_2019_02
索引_2019_03
指数_2019_04
今天是2019/04/20,我们可以使用以下查询来获得04,03和02

GET /<index-{now/M-0M{yyyy_MM}}>,<index-{now/M-1M{yyyy_MM}}>,<index-{now/M-2M{yyyy_MM}}>  

我在第一个索引中使用了M-0M,因此查询构建循环不需要第一个索引的特殊情况
查看有关URL编码的文档,以及如何在索引名称中使用文字大括号,如果使用客户端,则URL编码将为您完成(至少在python客户端中)

使用正则表达式搜索索引名称可能是不可能的,正如本问题的另一篇文章中所列,但可以使用通配符使用indices.get请求(如GET /index-prefix*)按名称搜索索引。

请参阅此处的文档

最新更新