ElasticSearch具有多个术语的过滤别名

时间:2018-11-06 15:36:47

标签: 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" ]} }
            }
        }
    ]
}

我还可以对此类别名使用诸如count,delete_by_query,update_by_query之类的操作吗? 此类别名是否有任何限制
问候

1 个答案:

答案 0 :(得分:0)

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

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之类的操作吗?

  • 计数-是
  • delete_by_query

    • 是的,但与写入不同的是,is_write_index不适用于删除,这意味着即使提到了上述属性,查询POST myalias/_delete_by_query { "query": { "match_all": {} }}最终仍会删除所有索引中的所有数据。

    • 确保您不会意外删除别名所指向的所有索引的更好方法是不使用别名。

  • update_by_query-上面已经提到。

我有一个要求,我想在其中使用别名对多个用户的文档进行分组,如果我们按照以下方式创建具有多个过滤条件的别名,这将是一个好主意

出于限制,您可以参考此SOF link

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

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

  • 主要索引-globalindex
  • 别名-asia-pacificeuropeamericasafrica

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

希望有帮助!