ElasticSearch(二)【基本操作以及集成 SpringBoot】

news2024/9/19 11:08:28

启动 elasticsearch(脚本)、kibana(bat脚本) 和 elasticsearch-head-master(npm run start)

1、RESTful 风格

1.1、索引类基本操作

1.1.1、创建索引

PUT /索引名/类型名/文档id
{请求体}

在 elasticsearch-head-master 查看:

可以看到,索引 test1 被成功创建了 ,查看数据:

1.1.2、基本数据类型

  • 字符串类型
    text、keyword
  • 数值类型
    long、integer、short、byte、double、float、half float、scaled float
  • 日期类型
    date
  • 布尔值类型
    boolean
  • 二进制类型
    binary

创建索引的时候可以不指定索引规则(字段类型),es 会自动判断(只不过有时候可能判断错误)

1.1.3、创建索引时指定字段类型

下面,我们创建一个索引,并指定索引规则:

1.1.4、获得索引规则信息

语法

# 获得索引信息
GET 索引
# 获得文档信息
GET 索引/类型/文档id

1.1.5、修改数据

1)使用 PUT 覆盖

修改 /test1/type1/1 中的 age 属性为 18:

这种方法的一个缺点是,我们在覆盖的过程中可能会不小心漏掉一些字段,导致数据丢失。

2)POST 更新文档

修改  /test1/type1/1 的 name 属性为 "燕双鹰"

1.1.6、删除索引

删除 test2 索引:

DELETE test2

1.2、文档操作

1.2.1、基本操作

1、PUT 插入数据
PUT /lyh/user/1
{
  "name": "李大喜",
  "age": 25,
  "desc": "只想做农民",
  "tags": ["半人半鬼","神枪第一"]
}

PUT /lyh/user/2
{
  "name": "谢永强",
  "age": 20,
  "desc": "那啥,我去趟果园",
  "tags": ["窝囊强","果园天尊"]
}
PUT /lyh/user/3
{
  "name": "曾泰",
  "age": 45,
  "desc": "大人真乃神人也",
  "tags": ["舔灵"]
}
2、GET 查询数据

3、更新数据

4、普通文档查询
GET /lyh/user/1
5、条件查询

1.2.2、复杂查询

        对比上面普通 GET 查询和条件查询可以看到,使用条件查询时返回的 JSON 中有一个 _score 字段,它代表的是匹配度,也就是权重,因为 es 返回的是权重最高的数据。

 score(权重)

设置投影

排序

因为原本是按照权重排序的,但是这里使用了 age 作为排序字段,所以 _score 字段为 null

分页查询

条件过滤查询(bool)

and (must)

or (should)

not(must_not)

 可以看到,这里过滤出了 age 不等于 25 的和姓名不是 "谢" (这里的 "谢" 指的是分词器分词后所包含的)的记录。

range(filter)

上面,我们过滤出了所有 age >= 20 并且 <= 30 的记录

匹配多个条件

精确查询

term 查询是直接通过倒排索引进行精确查询的,区别于上面我们只用的 match:

  • term 是精确查询
  • match 会使用分词器

text 类型会被分词器解析,而 keyword 类型不会被分词器解析

测试 keyword 分词:

可以看到,使用 keyword 分词器不会把文本分开;

测试默认标准分词器

可以看到,使用默认标准的分词器是会把文本完全拆开的,这也是上面为什么我们可以模糊匹配的原因;

查询类型为 text 的 name 字段: 

查询字段类型为 keyword 的 desc 字段: 

所以结论就是:keyword 类型的字段不会被分词器解析。

下面我们对比一下精确查询和普通查询的区别:

我们的 test2 索引中只有两条记录(name 分别为 "数据开发工程师" 和 "数据平台开发工程师")可以看到,当使用精确查询的时候,查询 "数据" 是查不出来的,这是因为精确查询默认会使用分词器,而标准的分词器是不支持中文的,它会把每一个中文都当做一个词,所以上面当查询 "数" 的时候才可以查出来。

可以看到,当使用普通匹配查询时, 就可以查询出所有包含该词的所有记录;

高亮查询

可以看到,查询出来的结果中的匹配字段被加上了 html 标签,我们也可以自定义这个标签:

1.3、ES 集成 SpringBoot

1.3.1、ES 配置类 

@Configuration
public class ElasticSearchClientConfig {

    // <bean id="restHighLevelClient" class="org.elasticsearch.client.RestHighLevelClient">
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost",9200,"http")
                )
        );
    }

}

1.3.2、创建索引 

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    private RestHighLevelClient client;

    // 索引创建
    @Test
    void testCreateIndex() throws IOException {
        // 1. 创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("lyh_index");
        // 2. 执行请求,返回响应
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);

        System.out.println(createIndexResponse);
    }
}

执行结果:

可以看到,成功创建了一个索引(没有任何字段)

1.3.3、判断索引是否存在

// 判断索引是否存在
    @Test
    void testGetIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("lyh_index");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

1.3.4、删除索引

// 删除索引
    @Test
    void testDeleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("lyh_index");
        AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }

1.3.5、创建文档

创建 Student 类: 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Student {
    private String name;
    private int age;
}

 导入 fastjson 并测试:

//  测试添加文档
    @Test
    void testAddDocument() throws IOException {
        Student student = new Student("李元芳",20);
        IndexRequest request = new IndexRequest("lyh_index");
        // 索引规则
        request.id("1");
        request.timeout("1s");
        // 放入请求
        request.source(JSONValue.toJSONString(student), XContentType.JSON);

        // 获取响应结果
        IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

        System.out.println(indexResponse.toString());
        System.out.println(indexResponse.status());
    }

上面的代码相当于:

PUT /lyh_index/_doc/1
{
    "name": "李元芳",
    "age": 20
}

  执行结果:

1.3.5、判断文档是否存在

    @Test
    void testExists() throws IOException {
        // 相当于 GET /lyh_index/_doc/1
        GetRequest getRequest = new GetRequest("lyh_index","1");
        boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(exists); 
    }

1.3.6、获取文档内容

    @Test
    void testGetDocument() throws IOException {
        // 相当于 GET /lyh_index/_doc/1
        GetRequest getRequest = new GetRequest("lyh_index","1");
        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse.getSourceAsString());
        System.out.println(getResponse);
    }

执行结果:

{"name":"李元芳","age":20}
{"_index":"lyh_index","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"name":"李元芳","age":20}}

1.3.7、更新文档内容

    @Test
    void testUpdateDocument() throws IOException {
        UpdateRequest updateRequest = new UpdateRequest("lyh_index","1");
        updateRequest.timeout("1s");
        Student student = new Student("狄如燕", 20);
        updateRequest.doc(JSONValue.toJSONString(student),XContentType.JSON);
        client.update(updateRequest,RequestOptions.DEFAULT);
    }

执行结果: 

1.3.8、删除文档

    @Test
    void testDeleteDocument() throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("lyh_index", "2");
        deleteRequest.timeout("1s");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.status());
    }

1.3.9、批量导入数据

    @Test
    void testBulkRequest() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");

        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("谢永强",20));
        students.add(new Student("谢小梅",25));
        students.add(new Student("谢广坤",50));
        students.add(new Student("刘能",51));
        students.add(new Student("赵四",48));
        students.add(new Student("王老七",52));
        students.add(new Student("刘英",21));

        for(int i=0;i<students.size();i++){
            bulkRequest.add(new IndexRequest("lyh_index")
                    .id(""+(i+1))
                    .source(JSONValue.toJSONString(students.get(i)),XContentType.JSON)
            );
            BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
            System.out.println(bulk.status());
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rewrk一个更现代的http框架基准测试实用程序

Rewrk一个更现代的http框架基准测试实用程序。HTTP基准测试&#xff08;HTTP benchmarking&#xff09;是一种测量和评估HTTP服务器或应用程序性能指标的活动。其目的是在特定条件下模拟大量用户请求&#xff0c;以测量服务器或应用程序的响应能力、吞吐量、延迟等指标&#xf…

员工微信号怎么管理

员工走私单或者离职了删除客户&#xff0c;删除撤回的消息也能看得见

强引用?软引用?弱引用?虚引用?一文带你彻底搞懂!!

强引用&#xff1f;软引用&#xff1f;弱引用&#xff1f;虚引用&#xff1f;一文带你彻底搞懂&#xff01;&#xff01; 前言引用级别强引用软引用弱引用虚引用 总结 前言 我们知道 JVM 的 GC 是不受程序控制的&#xff0c;只要满足条件就会自动触发 那他是根据什么触发的呢…

Apache防盗链、网页压缩、网页缓存

目录 网页压缩 类型 示例 动态添加模块操作步骤 重装Apache操作步骤 网页缓存 示例 操作步骤 隐藏版本信息 操作步骤 Apache防盗链 定义 原理 配置防盗链实验环境 实验环境 本地图片盗链示例 操作步骤 防盗链示例 操作步骤 网页压缩 网站的访问速度是由多个…

C语言 结构体和共用体——对结构体的操作

目录 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作

C++基础技能:如何在VisualStudio中使用clang-format格式化代码

目录 1.下载 clang-format.exe程序 2.clang-format详细参数说明 3.Visual Studio中设置使用clang-format 4.创建.clang-format文件 5.在Visual Studio中触发格式化 1.下载 clang-format.exe程序 下载源&#xff1a; https://llvm.org/builds/下载最新的clang-format。ht…

开发编码规范笔记

前言 &#xff08;1&#xff09;该博客仅用于个人笔记 格式转换 &#xff08;1&#xff09;查看是 LF 行尾还是CRLF 行尾。 # 单个文件&#xff0c;\n 表示 LF 行尾。\r\n 表示 CRLF 行尾。 hexdump -c <yourfile> # 单个文件&#xff0c;$ 表示 LF 行尾。^M$ 表示 CRLF …

晨持绪电商:开一家抖音网店到底有前景吗

在数字化浪潮汹涌的今天&#xff0c;抖音作为一颗耀眼的新星&#xff0c;不仅重塑了人们的娱乐方式&#xff0c;更是成为电商领域的新战场。但许多人仍在观望&#xff0c;心中充满疑问&#xff1a;开一家抖音网店&#xff0c;究竟有没有前景? 抖音的流量优势不容忽视。凭借数亿…

CVE-2024-23692: Rejetto HTTP File Server 2.3m Unauthenticated RCE漏洞复现

目录 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 漏洞简介 漏洞环境 漏洞复现 exp 复现 结果 如何修复 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 Rejetto是一个流行的开源软件项目&#xff0c;主要…

【RHCE】dns实验0709

题目&#xff1a; 配置主服务器的web内容 web部分 创建web页面 修改增加etc/hosts内容且重启 测试&#xff1b; dns 区域文件 防火墙放行&#xff1a; 主服务器测试从服务器 从服务器 web dns 防火墙放行服务 selinux放行&#xff1a; 创建文件 定义特定文件 测试&#xff1…

ROS基础学习-ROS运行管理

ROS运行管理 目录 1. ROS运行管理简述2. ROS元功能包2.1 概念2.2 作用2.3 实现 3. ROS-launch文件3.1. ROS节点管理launch文件3.1.1 概念3.1.2 作用3.1.3 使用 3.2 launch文件标签 1. ROS运行管理简述 ROS是多进程(节点)的分布式框架&#xff0c;一个完整的ROS系统实现&#x…

城市窨井盖监测设备:让城市井盖不再“蹦迪”

近日&#xff0c;郑州暴雨来袭&#xff0c;街道瞬间变成河流&#xff0c;而原本默默无闻的井盖却成了“网红”&#xff0c;由于暴雨强大的水流压力&#xff0c;使它们在水中“随波逐流”上下跳动&#xff0c;网友直呼&#xff1a;这年头井盖都会“蹦迪”了。虽然是一句调侃&…

教你怎么不开DLSS3.0也能有效提高永劫无间帧数

永劫无间&#xff0c;一款国风的多人对战竞技游戏&#xff0c;游戏画面特别精美&#xff0c;在游戏中给玩家强烈的打击感&#xff0c;玩家在游玩过程中仿佛置身于游戏&#xff0c;而且此游戏非常受玩家欢迎。游戏中可以进行三人、双人、单人进行游玩&#xff0c;我们需要选择出…

前端必修技能:高手进阶核心知识分享 - 三万字详解CSS动画效果

在CSS的世界里,存在着多种能体现动画效果的属性:CSS transform、CSS Transition 和 CSS Animation。让开始接触CSS的同学感到困惑。要搞清楚CSS的动画,我们就必须先把这几种属性做一下区别。 CSS transform 属性、CSS Transition 属性、 CSS Animation 属性的区别 CSS tra…

地理信息科学在灾害管理中的应用:GIS构建防灾减灾的智慧防线

在全球气候变化与人类活动加剧的背景下&#xff0c;自然灾害频发&#xff0c;给社会经济发展带来了严峻挑战。本文将深入分析GIS在灾害预测、评估和响应中的核心作用&#xff0c;展示其如何为构建更加安全、韧性的社会提供智慧解决方案。 灾害预测&#xff1a;GIS的“先知”之…

【学习css2】grid布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…

YOLOv8改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

前端一面之 同步 vs 异步

异步 vs 同步 先看一下 下面的 demo console.log(100) setTimeout(function () {console.log(200) }, 1000) console.log(300) 执行结果 100 300 200console.log(100) alert(200) // 1秒钟之后点击确认 console.log(300) 这俩到底有何区别&#xff1f;—— 第一个示例中间的…

5,智能合约(react+区块链实战)

5&#xff0c;智能合约&#xff08;react区块链实战&#xff09; 5-1 智能合约5-2 metamask安装及私有链搭建互相联动5-3 solidity数据类型-布尔-数字-地址&#xff08;owner区别&#xff09;5-4 solidity 数组和映射&#xff08;代币转账&#xff09;5-5 solidity结构体与枚举…

强制升级最新系统,微软全面淘汰Win10和部分11用户

说出来可能不信&#xff0c;距离 Windows 11 正式发布已过去整整三年时间&#xff0c;按理说现在怎么也得人均 Win 11 水平了吧&#xff1f; 然而事实却是&#xff0c;三年时间过去 Win 11 占有率仅仅突破到 29%&#xff0c;也就跳起来摸 Win 10 屁股的程度。 2024 年 6 月 Wi…