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)

大家都在看

  • [ Python ] 音视频剪辑

    https://www.cnblogs.com/yeungchie/ 视频 提取视频 from moviepy.editor import * 从 MP4 文件提取 video =…

    Linux 2023年6月7日
    095
  • 微信小程序开发(1)

    微信小程序开发(1) 微信小程序开发(1) 代码结构与基本配置 代码结构与基本配置 基本HelloWorld创建 开发框架——基本构成 微信开发者工具 版本控制 WXML wxml…

    Linux 2023年6月8日
    0103
  • Linux目录操作(pwd、cd、ls、alias、du、mkdir、touch)

    pwd(打印当前目录) cd(### 切换目录) 命令 效果 cd 或 cd ~ 若不指定目标位置,切换到当前用户的宿主目录(家目录) cd – 到前一次目录 一个点号…

    Linux 2023年6月6日
    087
  • [转帖]Redis RDB 分析工具 rdbtools 说明

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    0107
  • 一文让你明白Redis持久化(RDB、AOF)

    为什么要持久化 Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器的数据库状态就会消失(即断电即失)。为了保证数据不丢失,我们需要将内存…

    Linux 2023年5月28日
    0110
  • markdown插入代码块导致列表缩进异常的解决方法

    前言 一、问题描述 总结 前言 最近正在用markdown写博客,发现插入代码块后,代码块和代码块后的内容会产生缩进异常,翻了翻网页,发现又是经典的一模一样的文章一大把,尝试了之后…

    Linux 2023年6月7日
    0196
  • Linux磁盘管理

    对Linux来说一切皆文件,Linux归根结底只有一个根目录,一个独立且唯一的文件结构,Linux的每个分区都是用来组成整个文件系统的一部分。所以Linux采用了磁盘挂载的方式,将…

    Linux 2023年6月8日
    0114
  • windows版本rabbitmq安装及日志level设置

    1.DirectX Repair 安装缺失的C++组件,不安装缺失的组件会造成第二部安装erl文件夹缺少bin文件夹2.安装otp_win64_23.1 1.配置 ERLANG_H…

    Linux 2023年6月7日
    0191
  • WPF获取系统dpi

    WPF获取系统dpi var dpiX = (int)typeof(SystemParameters).GetProperty("DpiX", BindingF…

    Linux 2023年6月13日
    097
  • Tmux 配置

    前面提到的窗口管理只是 tmux 功能的一小部分,另一个很有用的功能就是,连接到远程主机之后,一旦断开,那么当前账户登录的任务就被取消了,但是使用 tmux 可以在断开之后继续工作…

    Linux 2023年6月7日
    098
  • springboot mybatis层整合

    1、导入Mybatis包 使用maven 2、配置数据库连接 注意:classpath后不需要加 / 3、测试 4、建立实体类,可使用Lombok来简化 5、 创建mapper目录…

    Linux 2023年6月14日
    091
  • 设计模式——行为型设计模式

    行为型设计模式 针对对象之间的交互 解释器模式 java中用的很。JVM编译的时候就是对我们写的代码进行了解释操作;数据库SQL语句亦是如此 解释器:对语言进行解释,根据不同语义来…

    Linux 2023年6月7日
    0114
  • linux用户组管理

    一、简介 1、每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理,不同Linux系统对用户组的规定有所不同,如:Linux下在创建用户时,不指定用户组名,则会同时…

    Linux 2023年5月27日
    0126
  • 一文聊透 Netty IO 事件的编排利器 pipeline | 详解所有 IO 事件的触发时机以及传播路径

    欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 1. 前文回顾 在前边的系列文章中,笔者为…

    Linux 2023年6月6日
    099
  • 给你的计算机集群加一道安全屏障

    之前的LAXCUS集群操作系统系列文章介绍过,LAXCUS把集群分成内外两个网络环境。内网归管理员掌控,外网由用户操作,中间由网关连接,网关起着反向代理的作用,负责转发内外网络的通…

    Linux 2023年6月6日
    0100
  • Shiro结合Redis实现分布式或集群环境下的Session共享

    本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式或集群环境下的Session共享。在讲Session共享之前先说一下为什么要做Session共享。 什么是Sess…

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