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

2nbm6dog  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(4)|浏览(92)

我在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中正确的方法是什么?

i2loujxw

i2loujxw1#

如何查询多个同名索引?

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

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

字符串
或者,使用URI search

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


更多详情请访问here。请注意,Elasticsearch要求索引名称为小写。

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

简而言之,没有。可以在查询中使用特殊的“虚拟”字段_index来使用索引名称,但其使用受到限制。例如,不能对索引名称使用regexp:
_index被公开为一个虚拟字段 -- 它不会作为一个真实的字段添加到Lucene索引中。这意味着您可以在一个或多个术语查询(或任何重写为术语查询的查询,如match、query_string或simple_query_string查询)中使用_index字段,但它不支持前缀、通配符、regexp或模糊查询。
例如,上面的查询可以重写为:

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


它使用boolterms查询。
希望有帮助!

jgwigjjp

jgwigjjp2#

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

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

字符串
或在URL中

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

pkmbmrz7

pkmbmrz73#

虽然使用正则表达式搜索索引是不可能的,但您可能可以使用日期数学来更进一步。
您可以查看文档here
例如,假设您希望从这些指数中获得过去3个月的数据,这意味着如果我们有index_2019_01
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客户端中)

eit6fx6z

eit6fx6z4#

使用正则表达式来搜索索引名称可能是不可能的,正如在这个问题的另一篇文章中列出的那样,但是可以使用通配符通过indexs.get请求来搜索索引,比如GET /index-prefix*
参见此处的文档

相关问题