06-ElasticSearch搜索结果处理

*

package com.coolman.hotel.test;

import com.coolman.hotel.pojo.HotelDoc;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;

/**
 * 高亮显示
 */
@SpringBootTest
public class HighLightQueryTest {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    //jackson
    private final ObjectMapper objectMapper = new ObjectMapper();

    @Test
    public void testHighLightSearch() throws IOException {
        // 1. 创建查询请求对象
        SearchRequest searchRequest = new SearchRequest("hotel");

        // 2. 添加查询请求体

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        // 添加高亮字段方式1(暂时不知道什么区别,了解就好)
//        highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
//        highlightBuilder.fields().add(new HighlightBuilder.Field("brand"));
        // 添加高亮字段方式2
        highlightBuilder.field("name");
        highlightBuilder.field("brand");
        // 这里相当于是全局的配置,也可以在上面添加配置,如  highlightBuilder.field("name").requireFieldMatch(false).postTags("...").preTags("...");
        highlightBuilder.requireFieldMatch(false).preTags("").postTags("");

        searchRequest.source().query(
                QueryBuilders.matchQuery("name", "如家")
        ).highlighter(highlightBuilder);

        // 3. 执行操作,获取响应数据
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        // 4. 处理响应数据
        handlerResponse(response);
    }

    /**
     * 用来处理响应数据(相当于解析返回的JSON数据)
     * @param response
     */
    private void handlerResponse(SearchResponse response) throws JsonProcessingException {
        // 1. 得到命中的数量(即总记录数量)
        SearchHits hits = response.getHits();
        long totalCount = hits.getTotalHits().value;// 总记录数
        System.out.println("总记录数量为:" + totalCount);

        // 2. 获取本次查询出来的列表数据
        SearchHit[] hitsArray = hits.getHits();
        for (SearchHit hit : hitsArray) {

            // 得到json字符串
            String json = hit.getSourceAsString();
            // 将json字符串转换为实体类对象
            HotelDoc hotelDoc = objectMapper.readValue(json, HotelDoc.class);

            // 处理高亮的情况
            Map highlightFields = hit.getHighlightFields();
            if (highlightFields.size() > 0) {
                if (highlightFields.get("name") != null) {
                    Text nameHighLight = highlightFields.get("name").fragments()[0];
                    hotelDoc.setName(nameHighLight.toString());
                }
                if (highlightFields.get("brand") != null) {
                    Text brandHighLight = highlightFields.get("brand").fragments()[0];
                    hotelDoc.setBrand(brandHighLight.toString());
                }
            }
            System.out.println(hotelDoc);
        }
    }
}

Original: https://www.cnblogs.com/OnlyOnYourself-lzw/p/16570857.html
Author: OnlyOnYourself-Lzw
Title: 06-ElasticSearch搜索结果处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619779/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球