弹性搜索处理丢失的索引

时间:2014-12-15 10:55:44

标签: java database elasticsearch

我想知道是否有办法指定弹性搜索,我不介意在我的搜索查询中丢失或错误的索引。换句话说,我有一个查询,它试图查询7个不同的索引,但其中一个可能会丢失,具体取决于具体情况。我想知道的是,如果有办法说,忘掉那个破碎的那个并得到其他6个指数的结果?

    SearchRequestBuilder builder = elasticsearchClient.getClient().prepareSearch(indices)
            .setQuery(Query.buildQueryFrom(term1, term2))
            .addAggregation(AggregationBuilders.terms('term')
                                        .field('field')
                                        .shardSize(shardSize)
                                        .size(size)
                                        .minDocCount(minCount));

作为示例查询,您可以找到上面的查询。

2 个答案:

答案 0 :(得分:8)

查看 ignore_unavailable 选项,该选项是multi index syntax的一部分。至少从版本1.3开始就可以使用它,并允许您在执行搜索时忽略丢失或关闭的索引(以及其他多索引操作)。

它由IndicesOptions在Java API中公开。浏览源代码,我发现在示例中使用的SearchRequestBuilder上有一个setIndicesOptions()方法。您需要将IndicesOptions

的实例传递给它

IndicesOptions类上有各种静态工厂方法,用于使用您特定的所需选项构建实例。您可能会受益于使用更方便的lenientExpandOpen()工厂方法(或已弃用的版本lenient(),具体取决于您的版本),这些方法设置 ignore_unavailable = true allow_no_indices = true expand_wildcards = open

以下是示例查询的修改版本,它应该提供您要查找的行为:

SearchRequestBuilder builder = elasticsearchClient.getClient().prepareSearch(indices)
        .setQuery(Query.buildQueryFrom(term1, term2))
        .addAggregation(AggregationBuilders.terms('term')
                                    .field('field')
                                    .shardSize(shardSize)
                                    .size(size)
                                    .minDocCount(minCount))
        .setIndicesOptions(IndicesOptions.lenientExpandOpen());

答案 1 :(得分:1)

您是否尝试过使用Index Aliases

您可以指定单个索引值,而不是引用单个别名。在这背后可以是几个索引。

在这里,我将两个索引添加到别名并删除丢失/损坏的索引:

curl -XPOST 'http://localhost:9200/_aliases' -d '
{
   "actions" : [
      { "remove" : { "index" : "bad-index", "alias" : "alias-index" } },
      { "add" : { "index" : "good-index1", "alias" : "alias-index" } },
      { "add" : { "index" : "good-index2", "alias" : "alias-index" } }
   ]
}'