在具有2个索引和2个别名(每个索引中有1个)的Elasticsearch实例中,具有相同的名称,如何仅从一个索引中选择数据

时间:2015-03-27 15:40:11

标签: c# elasticsearch nest

我正在使用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实例的所有请求中包含路由值和过滤器值?

我对这个问题有任何想法。谢谢。

1 个答案:

答案 0 :(得分:1)

乍一看,elasticsearch端点PUT /{index}/_alias/{name}确实使它看起来像是一个“属于”索引的别名,但事实并非如此。别名不属于索引。

为索引创建别名时,您正在创建别名,然后向该别名添加索引。

为其他索引创建别名时,您使用相同的别名并为其添加另一个索引。

您的别名现在引用两个索引,您将从两个索引中获得结果。如果你想使用来自不同索引的两个过滤器,听起来你需要两个别名。