RestClient操作文档

本文档介绍了如何使用Java RestClient API进行查询、排序、分页操作,并重点讲解了查询结果的高亮显示。在查询结果中,高亮部分位于hits的highlight字段,需要额外解析。同时,提到了高亮显示的配置,如设置requireFieldMatch为false以实现不同匹配字段和高亮字段的配合。

核心方法:通过Java RestClient API得到的响应格式是JSON,需要对响应进行数据解析

    /**
     * 解析响应
     * @param response 响应结果(json数据)
     */
    private void handleResponse(SearchResponse response) {
        // (hits为封装的json数据,包含要查询的所有数据)
        SearchHits searchHits = response.getHits();
        long total = searchHits.getTotalHits().value;
        System.out.println("总数据:" + total);
        // 4.1 、获取查询结果的数组
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    }

  • 查询所有(入门)

void testMatchAll() throws IOException {
        // 1、准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2、编写DSL语句
        request.source().query(QueryBuilders.matchAllQuery());
        // 3、发送请求获取响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4、解析结果
        handleResponse(response);
    }
  • Boolean查询(组合查询)

        将查询条件一个个添加到boolQuery中组合

void testBooleanQuery() throws IOException {
        // 1、准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2、编写DSL语句
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.termQuery("city", "上海"));
        boolQuery.filter(QueryBuilders.rangeQuery("price").lte(300));
        request.source().query(boolQuery);
        // 3、发送请求获取响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4、解析结果
        handleResponse(response);
    }

排序和分页

  • sort():排序
  • from():分页起始页
  • size():分页大小
void testSortAndPage() throws IOException {
        int page = 3; int size = 5;
        // 1、准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2、编写DSL语句
        request.source().query(QueryBuilders.matchAllQuery());
        request.source().sort("price", SortOrder.DESC).from((page - 1) * size).size(size);
        // 3、发送请求获取响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4、解析结果
        handleResponse(response);
    }

查询结果高亮显示

 高亮显示默认要求匹配字段和高亮字段要匹配:requireFieldMatch(false):修改高亮匹配为false

void testHighlight() throws IOException {
        // 1、准备request
        SearchRequest request = new SearchRequest("hotel");
        // 2.1、编写DSL语句
        request.source().query(QueryBuilders.matchQuery("name", "如家"));
        // 2.2、 高亮显示
        request.source().highlighter(new HighlightBuilder().field("name"));
        // 3、发送请求获取响应
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4、解析结果
        handleResponse(response);
    }

在查询结果中,高亮结果在hits中的highlight中,需要额外解析

// 高亮结果解析
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
// 判断Map集合是否为空
if (!CollectionUtils.isEmpty(highlightFields)) {
    HighlightField highlightField = highlightFields.get("name");
        if (highlightField != null) {
            String name = highlightField.fragments()[0].toString();
            hotelDoc.setName(name);
        }
}
使用RestClient操作Elasticsearch主要分为以下步骤: ### 1. 引入依赖 需要引入es的RestHighLevelClient依赖,示例代码如下: ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> ``` 因为SpringBoot默认的ES版本是7.6.2,所以需要覆盖默认的ES版本,示例代码如下: ```xml <properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties> ``` ### 2. 初始化RestHighLevelClient 在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。示例代码如下: ```java import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; public class ElasticsearchClientConfig { public static RestHighLevelClient getRestHighLevelClient() { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); return client; } } ``` ### 3. 进行具体操作 以下是一些常见操作的示例: #### 创建索引 ```java import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import java.io.IOException; public class CreateIndexExample { public static void main(String[] args) throws IOException { RestHighLevelClient client = ElasticsearchClientConfig.getRestHighLevelClient(); CreateIndexRequest request = new CreateIndexRequest("my_index"); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT); boolean acknowledged = createIndexResponse.isAcknowledged(); System.out.println("Index created: " + acknowledged); client.close(); } } ``` #### 添加文档 ```java import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class AddDocumentExample { public static void main(String[] args) throws IOException { RestHighLevelClient client = ElasticsearchClientConfig.getRestHighLevelClient(); Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("message", "Hello Elasticsearch!"); IndexRequest request = new IndexRequest("my_index") .id("1") .source(jsonMap, XContentType.JSON); IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT); System.out.println("Document added: " + indexResponse.getId()); client.close(); } } ``` #### 查询文档 ```java import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import java.io.IOException; public class GetDocumentExample { public static void main(String[] args) throws IOException { RestHighLevelClient client = ElasticsearchClientConfig.getRestHighLevelClient(); GetRequest getRequest = new GetRequest("my_index", "1"); GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); if (getResponse.isExists()) { String sourceAsString = getResponse.getSourceAsString(); System.out.println("Document content: " + sourceAsString); } else { System.out.println("Document not found"); } client.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值