【发布时间】:2015-06-01 00:18:59
【问题描述】:
我正在使用 Elaticsearch v1.4.2 和 NEST .NET 客户端 v1.3.1。在同一台服务器和 Elasticsearch 实例上,我有 2 个索引(假设 IndexEnvironmentA、IndexEnvironmentB)。这两个索引中的每一个都保存相同类型(TypeA)的文档,但它们引用不同的环境(例如 UAT/DEV)。我想使用基于 A 类字段(比如 GroupId)的路由和过滤在这些索引上创建别名。
在我的代码中,我有以下片段,它在每个索引中创建别名。
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 实例的所有请求中包含路由值和过滤器值?
如果您对这个问题有任何想法,我将不胜感激。谢谢。
【问题讨论】:
标签: c# elasticsearch nest