Java Elasticsearch:查询
基本用法
实现ES查询的关键步骤:
- 创建 RestHighLevelClient,Java ES Client对象;
- 创建 SearchRequest 对象:负责设置搜索参数;
- 通过 Client对象发送请求;
- 处理搜索结果;
创建“RestHighLevelClient”
略(参考:Java Elasticsearch:基础:连接配置)
创建“SearchRequest”
创建 SearchRequest 对象步骤如下:
- 创建 SearchRequest 对象;
- 通过 SearchSourceBuilder 设置搜索参数;
- 将 SearchSourceBuilder 绑定到 SearchRequest 对象;
- 实际上大部分 SearchRequest 对象的搜索参数都是通过 SearchSourceBuilder 对象间接设置。
初始化“SearchRequest”
SearchRequest 负责设置搜索参数,包括:ES Query、分页参数等等常用设置(通过 SearchSourceBuilder 对象间接设置)。
// 创建SearchRequest对象,索引名=posts
SearchRequest searchRequest = new SearchRequest("posts");
创建“SearchSourceBuilder”
通过 SearchSourceBuilder 间接完成搜索参数的设置。
// 创建SearchSourceBuilder,构建ES搜索
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
构造查询条件
Java ES 查询条件是通过 QueryBuilders 工具类构建的:
QueryBuilder 是所有 Java ES 查询的基础接口;
// 例子-构建一个Match模糊查询
QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "kimchy")
.fuzziness(Fuzziness.AUTO)
.prefixLength(3)
.maxExpansions(10);
// 将QueryBuilders构建的查询,绑定到SearchSourceBuilder对象
sourceBuilder.query(matchQueryBuilder);
或:
// 设置ES查询条件
sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
设置分页参数
// 设置分页参数,偏移从0开始
sourceBuilder.from(0);
// 设置分页参数,分页大小=5
sourceBuilder.size(5);
设置排序参数
// 根据id字段,升序
sourceBuilder.sort("id", SortOrder.ASC);
设置请求超时时间
// 设置请求超时时间,60秒
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
将 SearchSourceBuilder 绑定到 SearchRequest 对象
// 将 SearchSourceBuilder 绑定到 SearchRequest 对象
searchRequest.source(sourceBuilder);
执行请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
处理结果
RestStatus status = searchResponse.status(); // ES请求状态
TimeValue took = searchResponse.getTook(); // 执行时间
Boolean terminatedEarly = searchResponse.isTerminatedEarly();
Boolean timedOut = searchResponse.isTimedOut(); // 是否超时
// 获取hits,SearchHits对象包含搜索结果
SearchHits hits = searchResponse.getHits();
// 搜索结果总数
TotalHits totalHits = hits.getTotalHits();
long numHits = totalHits.value;
// 遍历搜索结果
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// 获取文档内容,json字符串格式
String sourceAsString = hit.getSourceAsString();
// 获取文档内容,Map对象格式
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
}
完整示例
// 首先创建 RestClient,后续章节通过RestClient对象进行参数配置。
RestClientBuilder restClientBuilder = RestClient.builder(
new HttpHost("localhost", 9200, "http"), // 设置ES服务地址,支持多个
new HttpHost("localhost", 9201, "http"));
// 创建 RestHighLevelClient,请求都是通过 RestHighLevelClient 实例发出去的。
RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);
// 创建 SearchRequest 对象
SearchRequest searchRequest = new SearchRequest();
// 通过 SearchSourceBuilder 构建搜索参数
SearchSourceBuilder builder = new SearchSourceBuilder();
// 通过 QueryBuilders 构建ES查询条件
builder.query(QueryBuilders.termsQuery("order_id", 1,2,3,4,5));
// 设置搜索参数
searchRequest.source(builder);
// 执行ES请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 获取搜索到的文档
SearchHits hits = searchResponse.getHits();
// 遍历搜索结果
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// 获取文档内容,json字符串格式
String sourceAsString = hit.getSourceAsString();
// 获取文档内容,Map对象格式
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
}
全文搜索(MatchQueryBuilder)
全文搜索是 Elasticsearch 的核心特性之一,Java Elasticsearch 全文搜索查询主要由 MatchQueryBuilder 这个构造器配置。
创建“MatchQueryBuilder”
有两种方式创建MatchQueryBuilder
- 直接实例化 MatchQueryBuilder;
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "梯子教程");
- 参数1:字段名;
- 参数2:匹配关键词;
- 通过 QueryBuilders 工具创建;
// 可以直接赋值给QueryBuilder接口定义的对象 QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "梯子教程");
创建“SearchRequest”
Java 所有的 ES 查询请求都是通过 SearchRequest 对象进行设置,因此需要实例化 SearchRequest 对象,设置 query 参数。
SearchRequest searchRequest = new SearchRequest();
// 通过SearchSourceBuilder构建搜索参数
SearchSourceBuilder builder = new SearchSourceBuilder();
// 设置query参数,绑定前面创建的Query对象
builder.query(matchQueryBuilder);
// 设置SearchRequest搜索参数
searchRequest.source(builder);
执行请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
处理结果
(参考上一节)
短语查询(MatchPhraseQueryBuilder)
Elasticsearch 的 match_phrase 短语查询跟 match 的区别就是,关键词作为一个整体进行搜索,而不是拆分成一个个关键词。
创建“MatchPhraseQueryBuilder”
有两种方式创建MatchPhraseQueryBuilder
- 直接实例化 MatchPhraseQueryBuilder;
MatchPhraseQueryBuilder matchPhraseQueryBuilder = new MatchPhraseQueryBuilder("title", "Elasticsearch 查询语法");
- 参数1:字段名;
- 参数2:匹配关键词;
- 通过 QueryBuilders 工具创建;
// 可以直接赋值给QueryBuilder接口定义的对象 QueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("title", "Elasticsearch 查询语法");
创建“SearchRequest”
Java 所有的 ES 查询请求都是通过 SearchRequest 对象进行设置,因此需要实例化 SearchRequest 对象,设置 query 参数。
SearchRequest searchRequest = new SearchRequest();
// 通过 SearchSourceBuilder 构建搜索参数
SearchSourceBuilder builder = new SearchSourceBuilder();
// 设置 query 参数,绑定前面创建的 Query 对象
builder.query(matchPhraseQueryBuilder);
// 设置 SearchRequest 搜索参数
searchRequest.source(builder);
执行请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
处理结果
(参考上一节)
等值匹配(TermQueryBuilder)