如何在 Elastic High Level Rest Client 中使用 search_after 进行分页
How to use search_after in Elastic High Level Rest Client for pagination
我正在使用弹性 RestHighLevelClient 与 ES 对话。我能够查询基本查询。尽管我正在尝试使用 search_after api 从我的前端查询中设计分页 api。尽管 query_after 在 RestLowLevelClient api 中使用起来很简单,但我不知道如何在 HighLevel API.
中使用它
看起来 lucene api 有 SearchAfterSortedDocQuery,但我不知道如何将它与弹性搜索 api 一起使用。例如:在下面的代码中,我初始化了 SearchAfterSortedDocQuery 查询,但不确定如何使用它。
RestHighLevelClient client = ESRestClient.getClient();
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1",value1));
searchSourceBuilder.query(QueryBuilders.termQuery("field2",value2));
searchSourceBuilder.from(0);
searchSourceBuilder.size(limit);
SortField[] sortFields = new SortField[2];
sortFields[0]= new SortField("field1", SortField.Type.LONG);
sortFields[1]= new SortField("field2", SortField.Type.LONG);
FieldDoc fieldDoc = new FieldDoc(0,0); //Is this correct? how to initialize field doc?
fieldDoc.fields = new Object[2];
fieldDoc.fields[0] = new Long("-156034");
fieldDoc.fields[1] = new Long("2297416849");
SearchAfterSortedDocQuery query = new SearchAfterSortedDocQuery(new Sort(sortFields), fieldDoc);
searchRequest.source(searchSourceBuilder);
searchRequest.indices("index1");
try {
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(response);
}
catch(IOException e){
System.out.println(e);
}
}
我认为与其使用 SearchAfterSortedDocQuery,不如在 searchSourceBuilder 中设置 search_after,如下所示
searchSourceBuilder.searchAfter(new Object[]{sortAfterValue});
之后使用 SearchRequest 和 rest 客户端获取响应
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.types("type");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT)
SearchHits hits = searchResponse.getHits();
最后,您应该保留点击中 getSortValues() 的最后排序值,以便转到下一页。
hits.getAt(lastIndex).getSortValues()
Elasticsearch search_after api
希望对您有所帮助。
我正在使用弹性 RestHighLevelClient 与 ES 对话。我能够查询基本查询。尽管我正在尝试使用 search_after api 从我的前端查询中设计分页 api。尽管 query_after 在 RestLowLevelClient api 中使用起来很简单,但我不知道如何在 HighLevel API.
中使用它看起来 lucene api 有 SearchAfterSortedDocQuery,但我不知道如何将它与弹性搜索 api 一起使用。例如:在下面的代码中,我初始化了 SearchAfterSortedDocQuery 查询,但不确定如何使用它。
RestHighLevelClient client = ESRestClient.getClient();
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1",value1));
searchSourceBuilder.query(QueryBuilders.termQuery("field2",value2));
searchSourceBuilder.from(0);
searchSourceBuilder.size(limit);
SortField[] sortFields = new SortField[2];
sortFields[0]= new SortField("field1", SortField.Type.LONG);
sortFields[1]= new SortField("field2", SortField.Type.LONG);
FieldDoc fieldDoc = new FieldDoc(0,0); //Is this correct? how to initialize field doc?
fieldDoc.fields = new Object[2];
fieldDoc.fields[0] = new Long("-156034");
fieldDoc.fields[1] = new Long("2297416849");
SearchAfterSortedDocQuery query = new SearchAfterSortedDocQuery(new Sort(sortFields), fieldDoc);
searchRequest.source(searchSourceBuilder);
searchRequest.indices("index1");
try {
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(response);
}
catch(IOException e){
System.out.println(e);
}
}
我认为与其使用 SearchAfterSortedDocQuery,不如在 searchSourceBuilder 中设置 search_after,如下所示
searchSourceBuilder.searchAfter(new Object[]{sortAfterValue});
之后使用 SearchRequest 和 rest 客户端获取响应
SearchRequest searchRequest = new SearchRequest("index");
searchRequest.types("type");
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT)
SearchHits hits = searchResponse.getHits();
最后,您应该保留点击中 getSortValues() 的最后排序值,以便转到下一页。
hits.getAt(lastIndex).getSortValues()
Elasticsearch search_after api
希望对您有所帮助。