当前位置: 首页 > 知识库问答 >
问题:

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

戚修雅
2023-03-14

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

我将不胜感激对这个问题的任何想法。谢谢。

共有1个答案

王旺
2023-03-14

乍一看,弹性搜索endpoint PUT /{index}/_alias/{name} 确实让它看起来像是别名“属于”索引,但事实并非如此。别名不属于索引。

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

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

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

 类似资料:
  • 问题内容: 我正在尝试仅使用来自多索引DataFrame的一个索引来创建新的DataFrame。 理想情况下,我想要这样的事情: 和: 本质上,我想删除除level之外的多索引的所有其他索引。是否有捷径可寻? 问题答案: 一种方法是简单地重新绑定到所需的MultiIndex级别。您可以通过指定要保留的标签名称来做到这一点: 或使用级别的整数值: MultiIndex的所有其他级别将在此处消失。

  • 我正在尝试从多索引数据帧中仅使用一个索引来创建新的数据帧。 理想情况下,我想要这样的东西: 和: 基本上,我想删除除level之外的多索引的所有其他索引。有没有一个简单的方法可以做到这一点?

  • 问题内容: 我有一个使用MVC模式开发的应用程序,我现在希望为其建立多个模型的索引,这意味着每个模型具有不同的数据结构。 使用多个索引(每个模型一个索引还是在每个模型的相同索引中使用一个类型)是更好的选择吗?我认为这两种方式都需要不同的搜索查询。我刚刚开始。 如果数据集很小或很大,这两个概念在性能上是否存在差异? 如果有人可以为我推荐一些好的样本数据,我自己会测试第二个问题。 问题答案: 两种方法

  • 问题内容: 我在同一台Ubuntu服务器上有一个Rails 3应用程序的暂存和生产实例(使用tyre gem)。看来这两个实例都共享相同的elasticsearch索引,这显然不是我想要的。 如何使生产和登台实例使用单独的实例? 问题答案: 您需要覆盖索引名称。假设您要绑定ActiveRecord,它将根据相关模型创建索引名称。您可以使用这样的前缀来调整名称; 然后会创建一个名为的索引,以此类推。

  • 问题内容: 自几个月前以来,我的集群每天都有一个索引,每个索引有5个分片(默认),并且由于分片太多(超过1000个),我无法在整个集群上运行查询。 文档ID是自动生成的。 如何将索引合并为一个索引,处理有冲突的ID(甚至可能发生冲突)并更改类型? 我正在使用ES版本5.2.1 问题答案: 仅在使用ELK堆栈几个月并逐日创建索引后才可见的常见问题。这里有一些选项可以解决性能问题。 首先,您可以用来限

  • 问题内容: 我面临以下问题,我不确定什么是最佳实践。 考虑下表(该表会变大): id PK | Giver_id FK | FK | 日期 我正在使用InnoDB,据我了解,它会自动为两个外键列创建索引。但是,我还将在需要匹配以下特定组合的情况下进行大量查询: 。 每个这样的组合在表中将是唯一的。 在这些列上添加双列索引有什么好处,还是理论上两个单独的索引足够/相同? 问题答案: 如果您有两个单列

  • 问题内容: 我开始为我的项目研究elasticsearch。特别是1.5版。我正在考虑使用别名从复杂的索引设置中提取客户端应用程序。我最终可能会得到20到50个索引,每个索引10到30个别名。这将等于1500个别名。 我想知道每个索引和/或每个群集的别名数是否有限制。 提前致谢, P. 问题答案: 在Elasticsearch源代码中,我看到别名被引用为。Java中的数组似乎有很大的大小,我不用担

  • 我正在寻找一种简单的方法来选择熊猫数据框df中的特定值。 我的df行如下所示:编辑以使其更清晰 我的目标是选择每一行[1](df[索引])与一个新的索引。所以这是df.index0,8,以此类推... 是否有另一种可能的方法,而不是迭代整个df并检查行[1](df[索引])上的索引的更改? 我知道有一种方法可以像这样选择第n行:df.iloc[0::n,:]但是第[1]行上的索引更改(df[“in