elasticsearch 实战(一)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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("上海"))),


elasticsearch 实战(二)https://developer.aliyun.com/article/1392076

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4月前
elasticsearch使用 scroll 滚动分页实战实例
elasticsearch使用 scroll 滚动分页实战实例
234 0
|
2月前
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
101 12
|
3月前
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
|
3月前
|
存储 索引
Elasticsearch索引之嵌套类型:深度剖析与实战应用
Elasticsearch索引之嵌套类型:深度剖析与实战应用
|
3月前
|
存储 JSON 搜索推荐
Springboot2.x整合ElasticSearch7.x实战(三)
Springboot2.x整合ElasticSearch7.x实战(三)
35 0
|
3月前
|
存储 自然语言处理 关系型数据库
Springboot2.x整合ElasticSearch7.x实战(二)
Springboot2.x整合ElasticSearch7.x实战(二)
40 0
|
3月前
|
搜索推荐 数据可视化 Java
Springboot2.x整合ElasticSearch7.x实战(一)
Springboot2.x整合ElasticSearch7.x实战(一)
35 0
|
4月前
|
人工智能 自然语言处理 开发者
Langchain 与 Elasticsearch:创新数据检索的融合实战
Langchain 与 Elasticsearch:创新数据检索的融合实战
131 10
|
4月前
|
存储 缓存 监控
干货 | Elasticsearch 8.X 性能优化实战
干货 | Elasticsearch 8.X 性能优化实战
435 2
|
4月前
|
存储 机器学习/深度学习 API
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索
436 0
高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索