【问题标题】:How to find Index by Alias in Elasticsearch java api?如何在 Elasticsearch java api 中按别名查找索引?
【发布时间】:2014-10-10 13:52:18
【问题描述】:

重新编制索引需要 30 秒,我不希望每次需要重新编制索引时我的搜索脱机 30 秒。我正在尝试这样做:

  1. 使用别名 = abc123 查找旧索引
  2. 创建新索引并填充新数据
  3. 移除别名并删除旧索引
  4. 赋予新索引别名 = abc123

我似乎找不到任何执行 1) 的 java 代码。其他一切都很好。任何人?还是有其他更好的方法?

使用 Elasticsearch 0.90.9。

【问题讨论】:

  • 你在使用任何管理插件吗?像elasticsearch-head、elasticsearch-hq
  • 没有。只需使用基本的 TransportClient()

标签: java elasticsearch


【解决方案1】:

以下是在给定别名中查找所有索引的方法供您参考:

public Set<String> getIndicesFromAliasName(String aliasName) {

    IndicesAdminClient iac = client.admin().indices();
    ImmutableOpenMap<String, List<AliasMetaData>> map = iac.getAliases(new GetAliasesRequest(aliasName))
            .actionGet().getAliases();

    final Set<String> allIndices = new HashSet<>();
    map.keysIt().forEachRemaining(allIndices::add);
    return allIndices;
}

【讨论】:

    【解决方案2】:

    您可以使用它来获取所有别名:

     client.admin().cluster()
        .prepareState().execute()
        .actionGet().getState()
        .getMetaData().getAliases();
    

    这将返回一个索引名称为keyaliases 为值的映射。因此,您可以遍历地图以获取索引名称。

    【讨论】:

    • 其实好像返回的是这样格式的map:alias => [ index_name => meta data, ... ]
    【解决方案3】:

    更好的解决方案是,地图将索引作为键

    GetAliasesResponse var = client.admin().indices().getAliases(new GetAliasesResponse var = client.admin().indices().getAliases(new GetAliasesRequest("merged")).actionGet();
    ImmutableOpenMap<String, List<AliasMetaData>> v1 = var.getAliases();
    

    【讨论】:

    • 我同意。而不是获取整个集群的元数据,这是一个更好的请求
    【解决方案4】:

    使用最新的 API,接受的答案不再有效。使用最新客户端(5.2.0)的类似解决方案:

    SortedMap<String, AliasOrIndex> lookup = esClient.admin().cluster()
        .prepareState().execute()
        .actionGet().getState()
        .getMetaData().getAliasAndIndexLookup();
    if (lookup.containsKey(ALIAS_NAME)) {
        lookup.get(ALIAS_NAME).getIndices().get(0).getIndex().getName();
    }
    

    或者,您可以像这样使用 Aliases API: esClient.admin().indices().prepareGetAliases(ALIAS_NAME).get().getAliases();

    结果映射的键是给定别名映射到的索引名称。

    【讨论】:

      【解决方案5】:
      private String getIndexNameFromAliasName(final String aliasName) {
          ImmutableOpenMap<String, AliasMetaData> indexToAliasesMap = client.admin().cluster()
                  .state(Requests.clusterStateRequest())
                  .actionGet()
                  .getState()
                  .getMetaData()
                  .aliases().get(aliasName);
          if(indexToAliasesMap != null && !indexToAliasesMap.isEmpty()){
              return indexToAliasesMap.keys().iterator().next().value;
          }
          return null;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多