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/581569/

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

(0)

大家都在看

  • 设计模式——结构性设计模式

    结构性设计模式 针对类与对象的组织结构。(白话:类与对象之间的交互的多种模式 类/对象适配器模式 当需要传入一个A类型参数,但只有B类型类时,就需要一个A类型的适配器装入B类的数据…

    Linux 2023年6月7日
    0115
  • CTF简介

    最近在学习渗透测试,后来发现CTF很有趣,发现对学习有所帮助,于是找了几个网站,下面推荐几个我觉得不错的网站 https://www.ctfhub.com/#/index http…

    Linux 2023年6月7日
    085
  • shell bash-shell

    bash shell中的命令替换,cmd或者$(cmd)。 bash shell中的变量赋值,直接name = var; ( bash中的变量赋值不能中间有空格) 变量引用时,$n…

    Linux 2023年5月28日
    092
  • linux三剑客试题汇总

    1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 2、显示etc目录下以root,centos或者user开头的信息 3、找出/etc/init.d/…

    Linux 2023年5月27日
    0104
  • 使用idea操作git(ssh协议)

    问题 我们发现,使用IDEA上的git功能,当使用ssh协议出现了可以commit但无法push和pull的问题,经过测试发现原因是Could not read from rems…

    Linux 2023年6月6日
    0120
  • PySimpleGUI 踩坑记

    最近在写一些处理芯片数据的代码,想给小伙伴们用,就想到写个GUI的页面,正好有人推荐使用PySimpleGUI, 首次使用就遇到了坑: 之前没有加try,运行的时候直接报错 inv…

    Linux 2023年6月14日
    076
  • 云主机实现校园网使用网络

    下载SoftEther 虚拟专用网络 Server 管理工具和 Open虚拟专用网络 GUI工具 配置云主机 tar -zxvf softether-vpnserver-v4.28…

    Linux 2023年6月8日
    079
  • 关于.NET CORE 编译时错误:Microsoft.AspNetCore.Razor.Design.CodeGeneration.targets(79, 5): The project XXXXX must provide a value for Configuration.

    此笔记记载了本人在编译.Net Core项目时遇到的 Microsoft.AspNetCore.Razor.Design.CodeGeneration.targets(79, 5)…

    Linux 2023年6月14日
    0104
  • 后端编写Swagger接口管理文档

    在后端开发当中,编写好多个接口后需要通过注解编写相应的接口文档提供给前端调用接口实现前后端分离。 Swagger接口管理文档 访问接口文档的网页:http://localhost:…

    Linux 2023年6月7日
    078
  • /dev/null文件的作用以及使用方法

    关于/dev/null,以及如何使用它 今天在看MIT的一个课程时,老师给的程序实例中有一个地方没弄明白: #!/bin/bash echo "Starting prog…

    Linux 2023年6月6日
    0105
  • 不同网段之间实现GDB远程调试功能

    在开发过程中,使用gdb远程调试时,会碰到 Linux 服务器的网段和板载设备的网段不是一样的,不能正常使用 gbd 远程调试功能。 板载设备和电脑连接路由器,属于同一个网段,如1…

    Linux 2023年6月7日
    086
  • 大数据之Hadoop集群的HDFS压力测试

    测试HDFS写性能 原文:sw-code1)写测试的原理 2)测试内容:向HDFS集群写10个128MB的文件(3个机器每个4核,2 * 4 = 8 < 10 < 3 …

    Linux 2023年6月8日
    082
  • Redis源码系列(一)

    Redis源码系列——内存管理 函数原型 src/zmalloc.h 函数指针与 void*指针的使用,提供了一个泛型的机制 /*stringfication*/ #define …

    Linux 2023年6月8日
    091
  • Linux驱动编程1——内核编译

    1.安装必要的内核开发包,包括gcc、make、libncurses-dev。 $ apt-get install gcc make libncurses-dev 2.$ make…

    Linux 2023年6月8日
    081
  • jarwarSpringBoot加载包内外资源的方式,告别FileNotFoundException吧

    工作中常常会用到文件加载,然后又经常忘记,印象不深,没有系统性研究过,从最初的war包项目到现在的springboot项目,从加载外部文件到加载自身jar包内文件,也发生了许多变化…

    Linux 2023年6月6日
    088
  • MongoDB安装使用教程

    MongoDB安装使用教程 介绍 MongoDB是一个基于分布式文件存储的数据库,是一个文档数据库,支持的数据结构非常松散,是类似json的bson格式,可以存储比较复杂的数据类型…

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