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