1. Search Scroll API 搜索滚动API
- 滚动API可用于从搜索请求中检索大量结果。为了使用滚动,需要按照给定的顺序执行以下步骤。
final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
SearchRequest searchRequest = new SearchRequest("posts");
searchRequest.scroll(scroll);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchQuery("title", "Elasticsearch"));
// 创建SearchRequest及其对应的SearchSourceBuilder。还可以选择设置大小以控制一次检索多少个结果。
searchSourceBuilder.size(size);
searchRequest.source(searchSourceBuilder);
// 设置滚动间隔
searchRequest.scroll(TimeValue.timeValueMinutes(1L));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = searchResponse.getScrollId();
SearchHit[] searchHits = searchResponse.getHits().getHits();
while (searchHits != null && searchHits.length > 0) {
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(scroll);
searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits();
}
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded();
2. Multi-Search API 批量搜索
- multiSearch API在单个http请求中并行执行多个搜索请求。
MultiSearchRequest request = new MultiSearchRequest();
SearchRequest firstSearchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("user", "kimchy"));
firstSearchRequest.source(searchSourceBuilder);
request.add(firstSearchRequest);
SearchRequest secondSearchRequest = new SearchRequest();
searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("user", "luca"));
secondSearchRequest.source(searchSourceBuilder);
request.add(secondSearchRequest);
MultiSearchResponse response = client.msearch(request, RequestOptions.DEFAULT);
// 通过执行multiSearch方法返回的MultiSearchResponse包含MultiSearchRequest中每个SearchRequest的MultiSearchResponse.Item。
// 如果请求失败,则每个MultiSearchResponse.Item都将在getFailure中包含异常;
// 如果请求成功,则将在getResponse中包含SearchResponse:
MultiSearchResponse.Item firstResponse = response.getResponses()[0];
assertNull(firstResponse.getFailure());
SearchResponse searchResponse = firstResponse.getResponse();
assertEquals(4, searchResponse.getHits().getTotalHits().value);
MultiSearchResponse.Item secondResponse = response.getResponses()[1];
assertNull(secondResponse.getFailure());
searchResponse = secondResponse.getResponse();
assertEquals(1, searchResponse.getHits().getTotalHits().value);
3. Field Capabilities API 字段API
- 字段功能API允许检索多个索引中的字段的功能。
- FieldCapabilitiesRequest包含要获取其功能的字段的列表(应返回),以及目标索引的可选列表。如果没有提供索引,则将在所有索引上执行请求。
- 请注意,fields参数支持通配符表示法。例如,提供text_ *将导致返回所有与表达式匹配的字段。
FieldCapabilitiesRequest request = new FieldCapabilitiesRequest()
.fields("user")
.indices("posts", "authors", "contributors");
FieldCapabilitiesResponse response = client.fieldCaps(request, RequestOptions.DEFAULT);
Map<String, FieldCapabilities> userResponse = response.getField("user");
FieldCapabilities textCapabilities = userResponse.get("keyword");
boolean isSearchable = textCapabilities.isSearchable();
boolean isAggregatable = textCapabilities.isAggregatable();
String[] indices = textCapabilities.indices();
String[] nonSearchableIndices = textCapabilities.nonSearchableIndices();
String[] nonAggregatableIndices = textCapabilities.nonAggregatableIndices();
4. Count API 计数API
- CountRequest用于执行查询并获取查询的匹配数。可以使用与SearchSource中使用SearchSourceBuilder相似的方式来设置要在CountRequest中使用的查询。
CountRequest countRequest = new CountRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
countRequest.source(searchSourceBuilder);
// CountRequest还采用以下可选参数:
CountRequest countRequest = new CountRequest("blog")
.routing("routing")
.indicesOptions(IndicesOptions.lenientExpandOpen())
.preference("_local");
CountResponse countResponse = client
.count(countRequest, RequestOptions.DEFAULT
long count = countResponse.getCount();
RestStatus status = countResponse.status();
Boolean terminatedEarly = countResponse.isTerminatedEarly();