我的Elasticsearch数据库中有几个索引,如下所示
Index_2019_01
Index_2019_02
Index_2019_03
Index_2019_04
.
.
Index_2019_12
假设我只想搜索前三个索引。 我的意思是这样的正则表达式:
select count(*) from Index_2019_0[1-3] where LanguageId="English"
在Elasticsearch中执行此操作的正确方法是什么?
答案 0 :(得分:1)
这可以通过multi-index search实现,这是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
的查询中使用索引名,但其使用受到限制。例如,不能对索引名称使用正则表达式:
_index显示为虚拟字段-不会将其添加到 Lucene索引是一个实际字段。这意味着您可以使用_index 字词或字词查询中的字段(或任何重写为 字词查询,例如match,query_string或simple_query_string 查询),但不支持前缀,通配符,正则表达式或模糊 查询。
例如,上面的查询可以重写为:
POST /_search
{
"query": {
"bool": {
"must": [
{
"terms": {
"_index": [
"index_2019_01",
"index_2019_02"
]
}
},
{
"match": {
"LanguageID": "English"
}
}
]
}
}
}
希望有帮助!
答案 1 :(得分:1)
虽然无法使用正则表达式搜索索引,但您可以使用日期数学来进一步了解。
您可以查看文档 here
举个例子,假设您希望从这些指数中获得过去 3 个月的数据
这意味着如果我们有
index_2019_01
index_2019_02
index_2019_03
index_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 客户端中)
答案 2 :(得分:0)
当您不向其中添加任何其他数据时,为何使用POST。 我建议您使用GET。其次,如果索引的名称与您的情况类似,则应在下面的查询中使用索引模式,
GET /index_2019_*/_search
{
"query": {
"match": {
"LanguageID": "English"
}
}
}
在网址中OR
curl -XGET "http://<host>:<port>/index_2019_*/_search" -H 'Content-Type: application/json' -d'{"query": {"match":{"Hex_Impact": "HIGH"}}}'