elasticsearch 实战

文章目录

      • 项目介绍
      • 导入项目
  • Elasticsearch Java API 查询文档
    • 快速入门
      • 发起查询请求
      • 解析响应
      • 完整代码
    • match查询
    • 精确查询
    • 布尔查询
    • 排序、分页
    • 高亮
      • 高亮请求构建
      • 高亮结果解析

项目介绍

本项目是一个由spring boot 3.0.2在gradle 8.4和java 21的环境下搭建的elasticsearch项目demo,这个项目是基于新版的Elasticsearch Java API 制作的,符合最新的框架要求,由于是运用了Elasticsearch新版的java jar包,所以在查询的时候使用了大量的Stream流式编程和闭包,亦可以作为流式编程的巩固。

导入项目

项目可以使用文章绑定的资源,或者去底部的GitHub地址下载

Elasticsearch Java API 查询文档

快速入门

我们以match_all查询为例

发起查询请求

在这里插入图片描述

代码解读
上面的代码使用了流式编程的思想,首先选择用search表示是选择查询模式,然后用index决定搜索的索引库,然后用query构建查询索引,然后选择查询模式matchAll。

es中的查询语句

GET hotel/_search
{"query": {"match_all": {}}
}

解析响应

elasticsearch返回的结果是一个JSON字符串,结构包含:

  • hits:命中的结果
    • total:总条数,其中的value是具体的总条数值
    • max_score:所有结果中得分最高的文档的相关性算分
    • hits:搜索结果的文档数组,其中的每个文档都是一个json对象
      • source:文档中的原始数据,也是json转化成实体类的对象

因此,我们解析响应结果,就是逐层解析JSON字符串,流程如下:

  • HitsMetadata:通过response.hits()获取,就是JSON中的最外层的hits,代表命中的结果
    • HitsMetadata.total().value():获取总条数信息
    • SearchHits#getHits():获取SearchHit数组,也就是文档数组

完整代码

完整代码如下:

    @Testvoid testMatchAll() throws IOException {
//进行查询SearchResponse<HotelDoc> response = esClient.search(s -> s.index("hotel").query(q -> q.matchAll(m->m)),HotelDoc.class);handleResponse(response);}private void handleResponse( SearchResponse<HotelDoc> response) {HitsMetadata<HotelDoc> searchHits = response.hits();// 4.1.总条数long total = searchHits.total().value();System.out.println("总条数:" + total);// 4.2.获取文档数组List<Hit<HotelDoc>>  hits = searchHits.hits();// 4.3.遍历hits.forEach(i->{// 4.4 自动序列化HotelDoc hotelDoc = i.source();// 4.6.处理高亮结果// 1)获取高亮字段和高亮数据的mapMap<String, List<String>>  map = i.highlight();if (map!=null){// 2)根据字段名,获取高亮结果List<String> name = map.get("name");if (name!=null){// 3)获取高亮结果字符串数组中的第1个元素String hName= name.get(0);// 4)把高亮结果放到HotelDoc中hotelDoc.setName(hName);}}System.out.println(hotelDoc);
//            System.out.println(i.highlight());});}

match查询

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。

在这里插入图片描述

因此,Java代码上的差异主要是request.source().query()中的参数了。同样是利用QueryBuilders提供的方法:

而结果解析代码则完全一致,可以抽取并共享。

完整代码如下:

    @Testvoid testMatch() throws IOException {SearchResponse<HotelDoc> response = esClient.search(i->i.index("hotel").query(q->q.match(t->t.field("all")//设置请求字段.query("如家")//设置请求参数)),HotelDoc.class);handleResponse(response);}

精确查询

精确查询主要是两者:

  • term:词条精确匹配
  • range:范围查询

与之前的查询相比,差异同样在查询条件,其它都一样。

es语句

GET /hotel/_search
{"query": {"match": {"all": "如家"}}
}

查询条件构造的API如下:

SearchResponse<HotelDoc> response = esClient.search(s -> s.index("hotel").query(q->q.term(t->t.field("city").value("上海"))),

布尔查询

布尔查询是用must、must_not、filter等方式组合其它查询,代码示例如下:

es语句

GET /hotel/_search
{"query": {"match": {"all": "如家"}}
}

完整代码如下:

    @Testvoid testMatch() throws IOException {SearchResponse<HotelDoc> response = esClient.search(i->i.index("hotel").query(q->q.match(t->t.field("all")//设置请求字段.query("如家")//设置请求参数)),HotelDoc.class);handleResponse(response);}

排序、分页

es语句

GET hotel/_search
{"query": {"match_all": {}},"from": 0,"size": 5,"sort": [{"price": {"order": "desc"}}]}

完整代码示例:

@Test
void testPageAndSort() throws IOException {// 页码,每页大小int page = 1, size = 5;// 1.准备RequestSearchRequest request = new SearchRequest("hotel");// 2.准备DSL// 2.1.queryrequest.source().query(QueryBuilders.matchAllQuery());// 2.2.排序 sortrequest.source().sort("price", SortOrder.ASC);// 2.3.分页 from、sizerequest.source().from((page - 1) * size).size(5);// 3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析响应handleResponse(response);}

高亮

高亮的代码与之前代码差异较大,有两点:

  • 查询的DSL:其中除了查询条件,还需要添加高亮条件,同样是与query同级。
  • 结果解析:结果除了要解析_source文档数据,还要解析高亮结果

高亮请求构建

es语句

GET /hotel/_search
{"query": {"match": {"all": "如家"}},"highlight": {"fields": {"name": {"require_field_match": "false"}}}
}

上述代码省略了查询条件部分,但是大家不要忘了:高亮查询必须使用全文检索查询,并且要有搜索关键字,将来才可以对关键字高亮。

完整代码如下:

    @Testvoid testHighlight() throws IOException {SearchResponse<HotelDoc> response = esClient.search(s->s.index("hotel").query(q->q.match(t->t.field("all")//设置请求字段.query("如家")//设置请求参数)).highlight(h->h.fields("name",f->f.requireFieldMatch(false))),HotelDoc.class);handleResponse(response);}

高亮结果解析

高亮的结果与查询的文档结果默认是分离的,并不在一起。

代码解读:

  • 第一步:从结果中获取source。hit.getSourceAsString(),这部分是非高亮结果,json字符串。还需要反序列为HotelDoc对象
  • 第二步:获取高亮结果。hit.getHighlightFields(),返回值是一个Map,key是高亮字段名称,值是HighlightField对象,代表高亮值
  • 第三步:从map中根据高亮字段名称,获取高亮字段值对象HighlightField
  • 第四步:从HighlightField中获取Fragments,并且转为字符串。这部分就是真正的高亮字符串了
  • 第五步:用高亮的结果替换HotelDoc中的非高亮结果

完整代码如下:

private void handleResponse(SearchResponse response) {// 4.解析响应SearchHits searchHits = response.getHits();// 4.1.获取总条数long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");// 4.2.文档数组SearchHit[] hits = searchHits.getHits();// 4.3.遍历for (SearchHit hit : hits) {// 获取文档sourceString json = hit.getSourceAsString();// 反序列化HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);// 获取高亮结果Map<String, HighlightField> highlightFields = hit.getHighlightFields();if (!CollectionUtils.isEmpty(highlightFields)) {// 根据字段名获取高亮结果HighlightField highlightField = highlightFields.get("name");if (highlightField != null) {// 获取高亮值String name = highlightField.getFragments()[0].string();// 覆盖非高亮结果hotelDoc.setName(name);}}System.out.println("hotelDoc = " + hotelDoc);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/229575.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIP-十二、BGP常用属性

十二、BGP常用属性 实验拓扑实验需求及解法1.IP 地址已配置&#xff0c;自行测试直连。2.AS100 中运行 OSPF3.AS200 中运行 ISIS4.运行 BGP5.发布 BGP 路由6.修改起源属性 Origin7.修改 AS-path8.修改本地优先 Local-preference9.修改 MED 实验拓扑 实验需求及解法 本实验模拟…

【黑马程序员】——微服务全套——实战篇1

目录&#xff1a; 微服务技术栈导学1微服务技术栈导学2认识微服务-服务架构演变认识微服务-微服务技术对比认识微服务-SpringCloud服务拆分-案例Demo服务拆分-服务远程调用Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现Rib…

前馈式神经网络与反馈式神经网络的区别,联系,各自的应用范围和场景!!!

文章目录 前言一、前馈式神经网络是什么&#xff1f;二、前馈式神经网络包括&#xff1a;三、反馈式神经网络是什么&#xff1f;四、反馈式神经网络包括&#xff1a;总结 前言 前馈式神经网络和反馈式神经网络是两种主要的神经网络架构&#xff0c;它们在网络结构和应用场景上…

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日&#xff0c;冷喷涂技术及其在增材制造中的应用专题会在襄阳召开&#xff0c;来自国内外200多名科技工作者齐聚一堂&#xff0c;共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办&#xff0c;湖北超卓航空科技股份有限公司…

docker镜像分层、仓库、容器数据卷与常用软件安装

一、镜像分层 1、镜像概念&#xff1a; 镜像是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;将应用程序和配置依赖打包好行成一个可交付的运行环境&#xff0c;这个打包好的运行环境就是image镜像文件。 2、镜像分层&#xff1a…

哈希函数:保护数据完整性的关键

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

额,收到阿里云给的赔偿了!

众所周知&#xff0c;就在刚过去不久的11月12号&#xff0c;阿里云突发了一次大规模故障&#xff0c;影响甚广。 以至于连咱们这里评论区小伙伴学校的洗衣机都崩了&#xff08;手动doge&#xff09;。 这么关键的双11节点&#xff0c;这么多热门业务和产品&#xff0c;这么大规…

应用在智能手环距离检测领域的数字红外接近检测模块

智能手环是现代人日常生活中的一种智能配件&#xff0c;可以帮助我们记录运动数据、监测身体健康状况等。然而&#xff0c;对于许多用户来说&#xff0c;关注的问题之一就是智能手环的有效距离和精准度。智能手环通过内置传感器收集数据并将其发送到手机或其他设备上进行处理。…

毫米波雷达DOA角度计算-----MUSIC算法

MUSIC算法如下&#xff1a; txNum &#xff1a;发射天线 2个 &#xff0c;rxNum&#xff1a;接收天线 4 个 。 ant &#xff1a; 为目标点的 天线 接收数据 &#xff0c; 为 8*1矩阵。 A ant;d 0.5;M 1; % # 快拍数ang_ax -90:90; % 角度坐标% 接收信号方向向量for k1:…

用Python爬取电影数据并可视化分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

离散系统的频域分析(数字信号处理实验2-1)

创建具有15 Hz和40 Hz分量频率的信号&#xff0c;叠加两个信号形成混合信号x&#xff0c;使用fft命令绘制x的频域图&#xff0c;标注频率为横坐标&#xff0c;平均能量为纵坐标。 文章目录 一.题目二.实验目的三.实验仪器四.实验原理1.MATLAB使用函数2.离散傅里叶变换(DFT)实验…

如何用CHAT写“科技探索者”视频号运营方案

问CHAT&#xff1a;生成一篇“科技探索者”视频号运营方案&#xff0c;要求内容&#xff1a; &#xff08;1&#xff09;视频号的定位、面向的人群、主要发布哪方面的内容 &#xff08;2&#xff09;视频号的内容设计&#xff08;用什么样的方式来体现、最好有内容创意&#xf…