如何在Elasticsearch java api中找到Alias索引?

时间:2014-08-17 14:08:27

标签: java elasticsearch

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

  1. 使用alias = abc123
  2. 查找旧索引
  3. 创建新索引并填写新数据
  4. 删除别名并删除旧索引
  5. 提供新索引别名= abc123
  6. 我似乎无法找到任何1代码的java代码。其他一切都很好。任何人?还是有另一种方式更好?

    使用Elasticsearch 0.90.9。

4 个答案:

答案 0 :(得分:10)

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

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

这将返回一个地图,其中索引名称为keyaliases为值。因此,您可以迭代地图以获取索引名称。

答案 1 :(得分:4)

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

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

答案 2 :(得分: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();
}

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

生成的映射的键是给定别名映射到的索引名称。

答案 3 :(得分:2)

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;
}