elasticsearch 实战

项目介绍

本项目是一个由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数组,也就是文档数组

完整代码

完整代码如下:

    @Test
    void 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)获取高亮字段和高亮数据的map
            Map<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提供的方法:

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

完整代码如下:

    @Test
    void 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": "如家"
    }
  }
}

完整代码如下:

    @Test
    void 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.准备Request
    SearchRequest request = new SearchRequest("hotel");
    // 2.准备DSL
    // 2.1.query
    request.source().query(QueryBuilders.matchAllQuery());
    // 2.2.排序 sort
    request.source().sort("price", SortOrder.ASC);
    // 2.3.分页 from、size
    request.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"}}
  }
}

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

完整代码如下:

    @Test
    void 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) {
        // 获取文档source
        String 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);
    }
}
elasticsearch实战应用从入门到高效使用java集成es快速上手 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎。高效的全文搜索:基于倒排索引,支持高效的文本搜索。实时数据分析:支持快速查询和数据聚合,适合进行实时分析。分布式架构:具备自动分片、复制和横向扩展能力。灵活的数据建模:通过索引映射(Mapping)和类型(Type)配置,实现灵活的数据建模。索引(Index):数据存储的逻辑容器,类似于数据库中的表。文档(Document):索引中的一条数据记录,类似于数据库中的行。字段(Field) 阅读详情

相关推荐

基于Scrapy与Elasticsearch的免佣金房源垂直搜索引擎实战

垂直搜索引擎是一种针对特定领域或行业进行深度信息检索的技术系统。其核心原理在于通过聚焦的数据采集、结构化的索引构建和精准的查询匹配,为用户提供比通用搜索引擎更专业、更高效的搜索体验。在工程实践中,垂直搜索引擎的技术价值在于能够整合分散的行业数据,解决信息不对称问题,并可通过定制化算法优化搜索结果。典型的应用场景包括电商比价、招聘信息聚合、学术文献检索以及本地服务发现等。本文以构建一个聚合免佣金或低佣金房源的垂直搜索引擎为例,详细阐述了如何利用Scrapy框架进行数据抓取,并结合Elasticsearch实现

WGH100817的博客 516

【ElasticSearch(五)进阶】两种_search检索方式,match_all检索,Query DSL基本使用...

【ElasticSearch(五)进阶】两种_search检索方式,match_all检索,Query DSL基本使用 一、导入测试数据 ElasticSearch官方为我们准备了一部分测试数据供调试使用,我们可以Kinaba内进行数据导入处理 1.获取数据https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip 2...

u012161251的博客 1004

解锁Elasticsearch高效搜索引擎:深度解析与实战技巧

Elasticsearch通过高效的倒排索引和分布式处理架构,实现了低延迟、高吞吐的数据检索能力。本文深入剖析了Elasticsearch的核心概念和搜索引擎原理,并结合应用实践介绍了其高效搜索能力的实现方式及最佳应用场景。

专业深耕,技术前沿 1258

ES聚合查询在基本语法

以下代码均在Kibana的dev tools下执行 1、创造数据 POST /test_aggs/infos/1?pretty { "title":"test class 01", "price": 20, "desc": ["good","very","handsome"] } POST /test_aggs/infos/2?pretty { "title":"tes...

数据与算法架构提升之路专栏 5680

Redis中什么是Big Key(大key)问题?如何解决Big Key问题?

通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一

weixiaohuai的博客 3万+

COMSOL求解器实战:如何避免非线性问题求解失败(附牛顿法调试技巧)

本文深入探讨了COMSOL求解器在处理非线性问题时常见的失败原因及解决方案。通过分析物理模型非线性特性、初始条件敏感性和求解器参数配置,提供了牛顿法调试的黄金四步法,包括模型检查、分阶段求解、参数调优和高级诊断工具应用。特别针对材料非线性、几何非线性和多物理场耦合等典型工程场景,给出了实战技巧和预防性建模策略,帮助工程师有效避免求解失败。

weixin_29284657的博客 421

ElasticSearch 高级查询语法Query DSL实战

ElasticSearch 高级查询语法Query DSL实战

持续学习,坚持原创,分享技术笔记及经验。 1124

手把手教你用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD)

本文详细介绍了如何使用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD),从软件安装、界面设置到基础项目创建和高级功能应用,手把手指导工程师完成系统可靠性分析。通过实际案例演示,帮助用户掌握RBD建模技巧,提升系统可靠性评估效率。

weixin_26765287的博客 633

ElasticSearch查询DSL之全文检索(match_all、match、match_phrase、match_phrase_prefix、multi_match)

在multi match查询的时候,有时候候可能存在这样的场景,比如说你在优快云搜索一篇包括mutli和match关键字的博客,这两个关键字可能在文章的标题中有,在内容中也有,但是明显在标题中同时出现这两个关键字的文章可能是我们更关心的,也就是相关性更大的,那么如何让这篇文章脱颖而出,排列在搜索结果的最前面呢?,如果我们要查找的两个单词按照顺序同时出现,那么肯定是比分别出现在不同的字段中是有意义的,我们就把两个单词同时按照顺序出现在一个字段中这种情况叫做。的算分策略是一致的,我们讨论。

阿星的博客 1万+

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 366

当知识图谱遇见多模态:突破文本界限的智能认知革命

本文探讨了知识图谱与多模态技术的融合,揭示了其在医疗诊断、文化保护等领域的革命性应用。通过图神经网络、对比学习框架和跨模态注意力机制等技术,实现了文本、图像和音频数据的智能关联与认知。文章还分享了在Neo4j等图数据库中的实践案例和优化策略,为构建下一代智能认知系统提供了技术参考。

weixin_29197835的博客 464

Elasticsearch搜索引擎入门与实战

本文将从Elasticsearch的基本概念、安装部署、核心功能、实战应用等方面进行详细阐述,帮助读者快速掌握Elasticsearch的使用。同时,我们也应该关注Elasticsearch的安全性和性能优化,以确保其在大规模应用中的稳定性和高效性。通过掌握Elasticsearch的基本概念、安装部署、核心功能,读者可以轻松构建高效的数据分析和搜索系统。Elasticsearch的搜索功能非常强大,支持多种查询类型,如匹配查询、短语查询、范围查询等。此查询将返回按分钟聚合的销售额数据。

2501_92487807的博客 547

PCI Express 权威指南:从协议原理到芯片实现

目录 全文总览第一部分:PCIe体系结构概览第1章 互连技术的演进与PCIe的诞生1.1 从ISA到PCI:并行总线的辉煌与瓶颈1.2 PCI-X的尝试与局限1.3 串行革命:从AGP、PCI到PCIe的范式转移1.4 PCIe的核心优势第2章 PCIe系统全局视角2.1 系统拓扑:Root Complex, Switch, Endpoint的职能与关系2.2 拓扑结构实例:服务器、工作站、嵌入式系统2.3 枚举与配置:系统如何发现和组织PCIe设备2.4 地址空间第3章 PCIe协议分层架构3.1 分层模

qq_42882296的博客 2895

最新的Elasticsearch7.X搜索引擎框架实战

19年全新录制Elasticsearch7.X搜索引擎项目实战Java架构全套视频教程

xdclass的博客 423

【异常】Python环境中没有安装 `openpyxl` 模块提示ModuleNotFoundError: No module named ‘openpyxl‘

是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的库。只是示例版本号,你可以根据需要选择不同的版本。安装完成后,再次尝试运行你的程序,应该就不会再出现。,这表明你的Python环境中缺少。运行一个Python程序时遇到了。如果由于某些原因你无法直接使用。,你可以指定版本号来安装,这里。要解决这个问题,你需要安装。

奶爸的编程之路,也就一周冷个三天 3399

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

Elasticsearch搜索引擎实战

本文详细探讨了Elasticsearch搜索引擎的实战应用,从数据检索、实时数据分析、大数据应用等方面阐述了Elasticsearch的优势和挑战。Elasticsearch作为一种强大的搜索引擎,在处理大规模数据时具有明显优势,但也面临着数据同步和资源消耗等挑战。优化数据同步策略,确保数据的一致性。合理配置资源,提高系统性能。深入研究Elasticsearch的聚合分析功能,挖掘数据价值。未来,随着数据量的持续增长,Elasticsearch在数据处理和分析领域的应用将更加广泛。

maohoubaji的博客 535

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Elasticsearch 实战应用

Elasticsearch 就是这么个简单又强大的工具,能帮咱们快速地存、搜、改、删数据。从安装到实战应用,一步步来,一点都不难。赶紧试试,让你的数据管理也能像用搜索引擎一样顺手!

qq_33449977的博客 670

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Elasticsearch实战应用:构建高效搜索引擎

Elasticsearch是一个基于Lucene构建的开源搜索引擎,允许用户通过RESTful API进行交互。它能够处理结构化和非结构化数据,支持全文搜索、数据分析和实时搜索等功能。分布式:支持集群部署,能够水平扩展。实时:数据写入后可以立即搜索。:易于集成和使用。Elasticsearch作为一个强大的搜索引擎,能够轻松处理和检索海量数据。通过本文的介绍,您应该能够快速上手Elasticsearch,构建自己的搜索应用。

码上飞扬的博客 1568

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

自然语言处理系列四十七》Elasticsearch搜索引擎》Elasticsearch代码实战

【配套新书教材】《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。

weixin_52610848的博客 1452

ElasticSearch优化实战:打造高性能搜索引擎的秘籍

本文深入探讨了ElasticSearch(ES)的优化策略,旨在帮助读者提升搜索引擎的性能和效率。文章首先介绍了ES的数据写入和搜索的流程。随后,通过具体用例分析,展现了在不同业务场景下的优化实践,如新闻内容检索、客户服务记录检索和物流信息追踪平台。这些用例揭示了索引分片调整、热点数据处理、异步写入、内容分级索引等多种优化手段的实际效果。文章强调优化ES是一个持续的过程,需要不断地监控、调整和优化以应对数据增长和业务需求的变化。

东境物语 2万+

视频教程-全文搜索引擎Solr与ElasticSearch入门至集群及项目实战(Solr+ES)-Java

全文搜索引擎Solr与ElasticSearch入门至集群及项目实战(Solr+ES) ...

weixin_33609368的博客 217

ElasticSearch搜索引擎教程—>实战篇 1:目录

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!试辅导),让我们一起学习成长!**

2401_84023604的博客 403

Elasticsearch搜索引擎入门与实战应用

Elasticsearch是一个基于Lucene构建的搜索引擎,它提供了丰富的RESTful API,可以轻松地实现数据的索引、搜索、分析和存储。Elasticsearch广泛应用于日志数据分析、实时监控、全文搜索等领域。本文从Elasticsearch的入门基础、核心概念、实战应用以及性能优化等方面进行了详细阐述。通过本文的学习,读者可以快速掌握Elasticsearch的基本使用方法,并在实际项目中灵活运用。

2501_92489038的博客 513

Elasticsearch 搜索引擎开发实战

内容简介 本书结合 Elasticsearch 在工程中的实际应用,详细介绍了使用 Elasticsearch 开发支持中文和英文搜索引擎的相关技术,从而实现系统监控。 本书共分为8章,内容涵盖了 Elasticsearch 搜索引擎开发的环境安装与配置;实现一个简单的网站搜索;开发中文搜索引擎;Mapping 详解;源代码分析;提高搜索相关性;使用 Spring Boot 开发搜索界面;使用 E...

GitChat 8137

【搜索引擎:Elasticsearch】从0了解ES,整合springboot,京东搜索实战

📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具 📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章 📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习 ✏️高质量技术专栏专栏链接: 微服务,数据结构,netty,单点登录,SSM ,SpringCloudAli.

doomwatcher的博客 2289
上一篇: 命令模式 rust和java实现
下一篇: SpringCloud 一
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值