如果群集处于红色状态时Elasticsearch搜索失败以避免不完整的结果?

时间:2015-08-25 15:56:13

标签: elasticsearch

我的Elasticsearch集群有多个节点,只有主分片,没有副本。正如ES文档所述,如果缺少某些主分片,则群集运行状况将变为红色,索引将失败,但搜索将返回部分数据。我正在使用客户端节点与群集通信。有没有办法要求ES返回完整的数据或告诉我出了什么问题?我想在搜索之前检查健康状况,可能是一个解决方案,但它会引入竞争条件本身,并会有性能损失。

针对此类情况的任何经过验证的解决方案?

2 个答案:

答案 0 :(得分:1)

您无法执行您要执行的操作。

如果群集是红色的,则意味着它不可访问,如果它不可访问,则不对分片或片段进行搜索,因此没有从分片返回结果。

结论,部分或无结果。

因此,除非在每个查询上检查群集运行状况,然后在返回运行状况检查绿色后再次查询结果,否则不能获取部分结果。

显然,此解决方案存在竞争条件,就像您在评论中提到的那样,但就目前而言,没有别的办法。

答案 1 :(得分:1)

当缺少分片时,我无法找到直接的搜索失败方法,但Elasticsearch会返回它尝试查询的分片数以及实际响应的分片数。所以你可以验证响应。如果您使用的是Java API,则SearchResponse类具有以下方法:

    int totalShards = searchResponse.getTotalShards();
    int successfulShards = searchResponse.getSuccessfulShards();
    int failedShards = searchResponse.getFailedShards();

您可以检查successShards是否等于总碎片。