文章目录
- 查询操作流程概述
- 构建并发起请求
- 1. 创建请求对象
- 2. 设置请求体
- 3. 发送请求
- 查询结果的解析
- 1. 解析结果结构
- 2. 获取总条数
- 3. 获取命中的数据
- 完整示例代码
- 总结
查询操作流程概述
Elasticsearch 查询操作大致可以分为两个部分:
- 构建并发起请求:这一步主要包括构建请求对象和设置查询参数。
- 解析查询结果:获取到查询结果后,如何从中提取出我们关心的数据。
构建并发起请求
在 Java 中,查询操作的核心步骤是构建请求对象并配置相关的查询参数,然后通过发送请求来获取结果。
1. 创建请求对象
在使用 Java Rest Client 查询 Elasticsearch 时,首先需要创建一个 SearchRequest 对象。该对象对应着我们发送请求时的路径和查询条件。
- SearchRequest 对象用于表示搜索请求。
- 在创建该对象时,我们需要指定索引库名,因为查询请求是基于特定索引库进行的。
// 1.创建request对象
SearchRequest request = new SearchRequest("items");
2. 设置请求体
接下来,我们需要构建请求体,即指定查询条件。请求体通常是一个 JSON 格式的数据,在 Java 中通过 request.source() 来构建。
request.source()
代表整个请求体,包含查询条件(query
)、分页条件(from/size
)、排序条件(sort
)、高亮显示(highlight
)等。
- 通过 query 设置查询条件,比如
query(QueryBuiliders.matchAllQuery())
方法。
例如,通过 QueryBuilders.matchAllQuery()
来构建一个 match all 查询。
// 2.配置request参数
request.source().query(QueryBuilders.matchAllQuery());
3. 发送请求
构建完成请求对象和请求体后,我们就可以使用客户端进行请求的发送。
- 发送请求的方法是:
client.search(searchRequest, RequestOptions.DEFAULT)
,返回的是查询结果。
// 3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
返回结果:
查询结果的解析
查询结果返回的格式是一个 JSON 对象,通常包含多个层次的信息。为了从中提取所需的数据,我们需要逐层解析。
1. 解析结果结构
查询结果中包含的主要信息有:
- took:查询消耗的时间
- hits:查询结果的具体内容
我们要从返回的 SearchResponse 对象中获取 hits 部分,即命中的数据。
// 4.解析结果
SearchHits searchHits = response.getHits();
2. 获取总条数
查询结果中的 total 字段表示总命中的文档数。通过 hits.total().value 可以获取到总条数。
// 4.1.总条数
long total = searchHits.getTotalHits().value;
3. 获取命中的数据
查询的结果存储在 hits 数组中,每个元素都是一个命中的文档。我们通过遍历该数组来提取每一条命中的数据。
// 4.2.命中的数据SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {// 4.2.1.获取source结果String json = hit.getSourceAsString();// 4.2.2.转为ItemDocItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);System.out.println("doc = " + doc);
每个 SearchHit 对象都包含一个 source 字段,它是该文档的原始 JSON 数据。我们可以将其转换为 Java 对象(如 ItemDoc
)。
完整示例代码
以下是一个完整的查询操作示例,展示了如何构建请求、发送请求以及解析查询结果。
@Test
void testMatchAll() throws IOException {// 1.创建request对象SearchRequest request = new SearchRequest("items");// 2.配置request参数request.source().query(QueryBuilders.matchAllQuery());// 3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析结果SearchHits searchHits = response.getHits();// 4.1.总条数long total = searchHits.getTotalHits().value;System.out.println("total = " + total);// 4.2.命中的数据SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {// 4.2.1.获取source结果String json = hit.getSourceAsString();// 4.2.2.转为ItemDocItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);System.out.println("doc = " + doc);}
}
总结
通过 Java Rest Client,我们可以方便地构建和发送 Elasticsearch 查询请求。查询操作的核心步骤如下:
- 构建请求对象:创建
SearchRequest
,并设置索引库名。 - 构建查询条件:通过
SearchSourceBuilder
配置查询条件、分页、排序等。 - 发送请求:使用
client.search
方法发送请求,获取查询结果。 - 解析查询结果:从响应中提取 hits 和 total,并遍历命中的文档,获取原始数据。