【问题标题】:In an Elasticsearch instance with 2 indexes and 2 aliases (1 in each index) with the same name how to select data only from one index在具有 2 个索引和 2 个别名(每个索引中 1 个)具有相同名称的 Elasticsearch 实例中,如何仅从一个索引中选择数据
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你知道有没有像GET /{alias}/{index}/_search这样的端点吗? (我很确定没有……)
    • 这不是别名的设计目的——它们是用来代替索引名称的,而不是附加的。如果您有 UAT/DEV 数据,标准方法是为每个环境使用单独的弹性搜索实例,而不是使用不同的索引。就像您永远不会在 SQL 数据库中将 UAT/DEV 数据混合在一起,而只是使用不同的表名来引用每个数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多