首页 > 解决方案 > ElasticSearch 过滤具有多个术语的别名

问题描述

我指的是文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html#filtered 根据这个我们可以有一个过滤别名如下

POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "test1",
                 "alias" : "alias2",
                 "filter" : { "term" : { "user" : "kimchy" } }
            }
        }
    ]
}

我有一个要求,我想使用别名来对多个用户的文档进行分组,如果我们创建具有多个过滤条件的别名,如下所示。

POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "test1",
                 "alias" : "alias2",
                 "filter" : { "terms" : { "user" : ["kimchy","testuser1","testuser2" ]} }
            }
        }
    ]
}

我也可以在这样的别名上使用计数、delete_by_query、update_by_query 等操作吗?此类别名是否有任何限制
问候,

标签: elasticsearch

解决方案


如果您的别名指向多个索引,则您只能在创建别名时需要明确提及的一个特定索引上执行写入(插入、更新),如下所示。

POST /_aliases
{  
   "actions":[  
      {  
         "add":{  
            "index": "mysampleindex",
            "alias": "myalias",
            "is_write_index": true
         }
      },
      {  
         "add":{  
            "index": "myothersampleindex",
            "alias": "myalias"
         }
      }
   ]
}

根据这个LINK

每个别名一次只能分配一个索引作为写入索引。如果没有指定写入索引并且有多个索引被别名引用,则不允许写入。

我也可以在这样的别名上使用count, delete_by_query, 之类的操作吗?update_by_query

  • count- 是的

  • delete_by_query

    • 是的,但与写入不同的是,这is_write_index不适用于删除,这意味着POST myalias/_delete_by_query { "query": { "match_all": {} }}即使提到了上述属性,查询最终也会从所有索引中删除所有数据。
    • 确保您不会意外删除别名指向的所有索引的更好方法是不使用别名。
  • update_by_query- 上面已经提到了。

我有一个要求,我想使用别名来对多个用户的文档进行分组,如果我们创建具有多个过滤器术语的别名,如下所示是个好主意吗?

那么限制,你可以参考这个SOF 链接

至于好主意,老实说,它取决于抽象级别,即您打算如何为应用程序添加抽象层。设计是一个广泛的主题,它取决于许多因素,例如您打算如何创建别名,而不是在查询中添加过滤器。需要注意的一件重要事情是,如果您将索引暴露给外部消费者并希望限制他们或确保他们不会得到不需要的结果,那么这肯定是有意义的。

我可以想到下面的用例,我认为使用过滤查询的别名是有意义的。

  • 主要指数 -globalindex
  • 别名 - asia-pacific, europe, americas,africa

globalindex将有一个名为的字段"region": "asia-pacific",您可以使用它来创建过滤器别名。但话又说回来,我并不是说这是最佳解决方案。我也可以创建多个索引。

希望能帮助到你!


推荐阅读