我正在使用Elaticsearch v1.4.2以及NEST .NET客户端v1.3.1。在同一台服务器和Elasticsearch实例上,我有2个索引(假设为IndexEnvironmentA,IndexEnvironmentB)。这两个索引中的每一个都保存相同类型的文档(TypeA),但它们指的是不同的环境(例如UAT / DEV)。我想基于类型A的字段(比如说GroupId)使用路由和过滤在这些索引上创建别名。
在我的代码中,我有以下snipet,它在每个索引中创建别名。
public void CreateAlias(string aliasName) {
_client.Alias(a => a.Add(
ad => ad.Index(_indexName)
.Alias(aliasName)
.Filter<TypeA>(f => f.Term(t => t.GroupId, aliasName))
.Routing(aliasName)));
}
创建别名后,我使用以下代码索引两个索引中的一些数据。
public void IndexDocument(TypeA t) {
_client.Index(t, ind => ind
.Index(_indexName)
.Routing(t.GroupId)
.Type(typeof (TypeA))
.Id(t.Id));
}
在测试使用Sense和match_all查询索引的数据时,我注意到以下内容:当我针对http://ElasticServerIP/IndexEnvironmentA/TypeA执行查询时,结果会像我期望的那样返回。 http://ElasticServerIP/IndexEnvironmentB/TypeA也是如此。
问题:
当我对http://ElasticServerIP/GroupIdX执行相同的查询(其中GroupIdX是每个索引中的不同别名但具有相同的名称)时,我从两个索引中获得结果。当然,当我使用NEST库将查询转换为C#时,会发生同样的情况。
_client.Search<TypeA>(s => s.Index(GroupIdX)
.Types(typeof (TypeA))
.From(From)
.Size(Size)
.Query(q => q.MatchAll()));
我能理解为什么会这样。 Elasticsearch无法知道我指的是哪两个索引(实际上是别名)。如果这是预期的行为,这是否意味着在这种情况下别名实际上没有用,我失去了他们(或他们的一些)的好处?我是否必须在发送给此Elasticsearch实例的所有请求中包含路由值和过滤器值?
我对这个问题有任何想法。谢谢。
答案 0 :(得分:1)
乍一看,elasticsearch端点PUT /{index}/_alias/{name}
确实使它看起来像是一个“属于”索引的别名,但事实并非如此。别名不属于索引。
为索引创建别名时,您正在创建别名,然后向该别名添加索引。
为其他索引创建别名时,您使用相同的别名并为其添加另一个索引。
您的别名现在引用两个索引,您将从两个索引中获得结果。如果你想使用来自不同索引的两个过滤器,听起来你需要两个别名。