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

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

  1. 查找alias = abc123的旧索引
  2. 创建新索引并填充新数据
  3. 删除别名并删除旧索引
  4. 给新索引别名= abc123

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

使用Elasticsearch 0.90.9。

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

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

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

以下是查找给定aliasName中所有索引的参考方法:

 public Set getIndicesFromAliasName(String aliasName) { IndicesAdminClient iac = client.admin().indices(); ImmutableOpenMap> map = iac.getAliases(new GetAliasesRequest(aliasName)) .actionGet().getAliases(); final Set allIndices = new HashSet<>(); map.keysIt().forEachRemaining(allIndices::add); return allIndices; } 

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

 GetAliasesResponse var = client.admin().indices().getAliases(new GetAliasesResponse var = client.admin().indices().getAliases(new GetAliasesRequest("merged")).actionGet(); ImmutableOpenMap> v1 = var.getAliases(); 

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

 SortedMap 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();

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

 private String getIndexNameFromAliasName(final String aliasName) { ImmutableOpenMap 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; }