ElasticSearch-query-搜索选项
2025-01-22 08:19:30    572 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)

ElasticSearch 查询搜索选项


1. preference

elasticsearch 搜索时,可以使用 preference参数来指定分片查询的优先级。

可以通过 preference参数 来控制搜索时查询的分片。

如果不设置该参数,查询会在所有有效的主分片以及副本分片间随机。

通过preference配置,可以有更多的选择定制,比如可以只查询主分片或只查询副本分片等…

不过需要注意,大部分情况,不需要使用preference配置,除非一些特殊情况,如 主分片不可读、主分片未分配等,可以读取指定正常分片的数据。

相关参数:

参数含义
_primary只查询主分片,不管有多少个副本,只对主shard进行检索(这种场景可以用在所有副本不可用的时候,强制读取主分片数据)
_primary_first优先读取主分片,如果主分片无效或者不可用,则会读取其他分片
_replica只查询副本分片
_replica_first优先查询副本分片,如果副本分片无效或不可用,就查询其他的分片
_local尽可能在本地分片执行查询,不跨网络
_prefer_nodes:abc,xyz在指定的节点id上执行查询
_shards:2,3查询指定分片上的数据,此外这种写法还可以和前面的用法组合,如:_shards:2,3
_only_nodes:abc*,x*yz,…限制在特定的node上执行操作
Custom (string) value自定义
DSL 使用格式
1
2
3
4
5
6
7
8
9
10
GET /testdata/data/_search?preference=_local
{
"query": {
"term": {
"text": {
"value": "apple"
}
}
}
}

Java API 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void test_preference(String index, String type, String id, String fieldName, Object value) {

QueryBuilder queryBuilder = new TermQueryBuilder(fieldName, value);

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);

SearchRequest searchRequest = new SearchRequest(index);
searchRequest.types(type);
searchRequest.source(searchSourceBuilder);
searchRequest.preference("_local");

SearchResponse searchResponse = elasticsearchActionImpl.execute(new HighClientAction<SearchResponse>() {
@Override
public SearchResponse doAction(RestHighLevelClient restHighLevelClient) throws Exception {
return restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

}
});
LOGGER.info("searchResponse:{}", searchResponse);

// ----------------------------------------------------------------------

GetRequest getRequest = new GetRequest(index);
getRequest.type(type);
getRequest.id(id);
getRequest.preference("_local");
GetResponse getResponse = elasticsearchActionImpl.execute(new HighClientAction<GetResponse>() {
@Override
public GetResponse doAction(RestHighLevelClient restHighLevelClient) throws Exception {
return restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
}
});
LOGGER.info("getResponse:{}", getResponse);
}

2. Reference