我想知道是否有办法指定弹性搜索,我不介意在我的搜索查询中丢失或错误的索引。换句话说,我有一个查询,它试图查询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));
作为示例查询,您可以找到上面的查询。
答案 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" } }
]
}'