Java中ES精确查询
介绍
在Java开发中,Elasticsearch(简称ES)是一个非常流行的搜索引擎,它提供了强大的全文搜索和分析功能。在ES中,精确查询是一种常见的搜索方式,它可以根据指定的关键词精确匹配文档。
本文将介绍如何在Java中使用ES进行精确查询,并提供相应的代码示例。
准备工作
在开始之前,需要确保已经安装并启动了Elasticsearch,以及在Java项目中引入了相应的ES客户端依赖。可以使用以下代码示例来引入Elasticsearch依赖:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.0</version>
</dependency>
精确查询的实现
在ES中,可以使用TermQueryBuilder
类来创建精确查询。TermQueryBuilder
接受两个参数,分别是字段名和要匹配的关键词。
以下是一个使用精确查询的示例代码:
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import java.io.IOException;
public class ExactMatchQueryExample {
private static final String INDEX_NAME = "my_index";
private static final String FIELD_NAME = "my_field";
private static final String SEARCH_TERM = "hello";
public static void main(String[] args) {
// 创建ES客户端
RestHighLevelClient client = createClient();
// 创建精确查询
TermQueryBuilder termQuery = QueryBuilders.termQuery(FIELD_NAME, SEARCH_TERM);
// 创建搜索请求
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(termQuery)
.size(10)
.timeout(TimeValue.timeValueSeconds(5));
SearchRequest searchRequest = new SearchRequest(INDEX_NAME)
.source(sourceBuilder);
// 执行搜索请求
try {
SearchResponse searchResponse = client.search(searchRequest);
// 处理搜索结果
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
String id = hit.getId();
String fieldValue = hit.getSourceAsMap().get(FIELD_NAME).toString();
System.out.println("ID: " + id + ", Field Value: " + fieldValue);
}
// 关闭ES客户端
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static RestHighLevelClient createClient() {
// 创建ES客户端
return new RestHighLevelClient(/* ES客户端配置 */);
}
}
在上述代码中,首先创建了一个ES客户端,然后使用TermQueryBuilder
创建了一个精确查询,指定了要匹配的字段名和关键词。接着,创建了一个SearchSourceBuilder
对象,并将精确查询设置为查询条件,同时还设置了查询的大小和超时时间。最后,创建了一个SearchRequest
对象,并将SearchSourceBuilder
设置为搜索请求的源。
最后,执行搜索请求,并处理搜索结果。在处理搜索结果时,可以通过SearchHit
对象获取匹配的文档ID和相应字段的值。
示例应用
为了更好地理解精确查询的应用场景,我们可以以一个简单的图书搜索应用为例来说明。
假设有一个图书搜索系统,用户可以根据图书的标题进行搜索。用户输入关键词后,系统将使用精确查询来匹配图书标题中包含该关键词的图书,并返回搜索结果。
以下是一个示例的状态图,描述了图书搜索应用的流程:
stateDiagram
[*] --> 输入关键词
输入关键词 --> 搜索图书
搜索图书 --> 显示搜索结果
显示搜索结果 --> 输入关键词
在Java中实现该图书搜索应用的代码如下:
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders