Elasticsearch讲解

news2024/11/17 11:33:59

1.Elasticsearch基本知识

1.基本认识和安装

Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括:

  • Elasticsearch:用于数据存储、计算和搜索

  • Logstash/Beats:用于数据收集

  • Kibana:用于数据可视化

整套技术栈被称为ELK,经常用来做日志收集、系统监控和状态分析等等;

Kibana是elastic公司提供的用于操作Elasticsearch的可视化控制台。它的功能非常强大,包括:

  • 对Elasticsearch数据的搜索、展示

  • 对Elasticsearch数据的统计、聚合,并形成图形化报表、图形

  • 对Elasticsearch的集群状态监控

  • 它还提供了一个开发控制台(DevTools),在其中对Elasticsearch的Restful的API接口提供了语法提示

安装elasticsearch

执行如下代码,并访问9200端口

docker run -d \
  --name es \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -e "discovery.type=single-node" \
  -v es-data:/usr/share/elasticsearch/data \
  -v es-plugins:/usr/share/elasticsearch/plugins \
  --privileged \
  --network hm-net \
  -p 9200:9200 \
  -p 9300:9300 \
  elasticsearch:7.12.1

安装Kibana

执行如下代码,并访问5601端口

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
kibana:7.12.1

2.倒排索引

正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程

倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程

正向索引

优点:                                                                       

  • 可以给多个字段创建索引

  • 根据索引字段搜索、排序速度非常快                                 

缺点:

根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

优点:

  • 根据词条搜索、模糊搜索时,速度非常快

缺点:

  • 只能给词条创建索引,而不是字段

  • 无法根据字段做排序

3.IK分词器

Elasticsearch的关键就是倒排索引,而倒排索引依赖于对文档内容的分词,而分词则需要高效、精准的分词算法,IK分词器就是这样一个中文分词算法。

需要将中文分词器挂载到es的数据卷上

官方默认方式

POST /_analyze
{
  "analyzer": "standard",
  "text": "世界人民大团结万岁"
}

IK分词器包含两种模式:

  • ik_smart:智能语义切分

  • ik_max_word:最细粒度切分

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "世界人民大团结万岁"
}
POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": "世界人民大团结万岁"
}

有些词语字典里面没有,需要自己手动添加,还可以对某些字或词语不进行分词

在config目录下如图三个文件

添加自己的词语和不希望分词的词语即可

4.mysql和es的对比

MySQL

Elasticsearch

说明

Table

Index

索引(index),就是文档的集合,类似数据库的表(table)

Row

Document

文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式

Column

Field

字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)

Schema

Mapping

Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)

SQL

DSL

DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

2.索引库的操作

1.Mapping映射属性

Mapping是对索引库中文档的约束,常见的Mapping属性包括:

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

    • 数值:longintegershortbytedoublefloat

    • 布尔:boolean

    • 日期:date

    • 对象:object

  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

2.索引库的CRUD

创建索引库

基本语法:

  • 请求方式:PUT

  • 请求路径:/索引库名,可以自定义

  • 请求参数:mapping映射

代码如下:

#新增
PUT /pxy
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "age":{
        "type": "byte"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object",
        "properties": {
          "firstname":{
            "type": "keyword"
          },
          "lastname":{
            "type": "keyword",
            "index":false
          }
        }
      }
    }
  }
}

查询索引库

基本语法:

  • 请求方式:GET

  • 请求路径:/索引库名

  • 请求参数:无

代码如下:

#查询
GET /pxy

修改索引库

无法修改索引库,但是可以添加新的字段

#es不支持修改,但可以添加
PUT /pxy/_mapping
{
  "properties":{
    "age":{
      "type":"byte"
    }
  }
}

删除索引库

语法:

  • 请求方式:DELETE

  • 请求路径:/索引库名

  • 请求参数:无

#删除
DELETE /pxy

3.文档的操作

1.文档的CRUD

增加数据

#新增数据
POST /pxy/_doc/1
{
  "info":"我是大帅哥",
  "age":18,
  "email":"123456@qq.com",
  "name":{
    "firstname":"潘",
    "lastname":"xy"
  }
}

查询数据

#查询数据
GET /pxy/_doc/1

删除数据

#删除数据
DELETE /pxy/_doc/1

修改数据

分为全量修改和局部修改。全量修改是删除原来的数据在新增数据,局部修改只是把原来的数据修改掉。

#修改数据

#全量修改
Put /pxy/_doc/1
{
  "info":"我是大帅哥",
  "age":17,
  "email":"123456@qq.com",
  "name":{
    "firstname":"p",
    "lastname":"xy"
  }
}

#局部修改
POST /pxy/_update/1
{
  "doc": {
    "info":"无敌是多么寂寞",
    "name":{
      "firstname":"wd",
      "lastname":"jm"
    }
  }
}

2.批量处理

一次处理多个请求

批处理采用POST请求,基本语法如下:

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

其中:

  • index代表新增操作

    • _index:指定索引库名

    • _id指定要操作的文档id

    • { "field1" : "value1" }:则是要新增的文档内容

  • delete代表删除操作

    • _index:指定索引库名

    • _id指定要操作的文档id

  • update代表更新操作

    • _index:指定索引库名

    • _id指定要操作的文档id

    • { "doc" : {"field2" : "value2"} }:要更新的文档字段

批量新增操作

POST /_bulk
  {"index":{"_index":"pxy","_id":"2"}}
  {"info":"我是大帅哥","age":17,"email":"123456@qq.com", "name":{"firstname":"p","lastname":"xy"}}
  {"index":{"_index":"pxy","_id":"3"}}
  {"info":"我是大帅哥","age":17,"email":"123456@qq.com", "name":{"firstnam:"p","lastname":"xy"}}

批量删除操作

POST /_bulk
  {"delete":{"_index":"pxy","_id":"2"}}
  {"delete":{"_index":"pxy","_id":"3"}}

4.用java程序操作es

1.注册RestHighLevelClient

在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。

导入依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.12.1<version>
</dependency>

初始化代码如下:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
        HttpHost.create("http://192.168.145.129:9200")
));

2.对索引进行操作

创建索引

    @Test
    public void createindex() throws IOException {
        //准备request对象
        CreateIndexRequest request = new CreateIndexRequest("pxy");
        //准备请求参数
        request.source(MAPPING_TEMPLATE, XContentType.JSON);
        //发送请求体
        client.indices().create(request, RequestOptions.DEFAULT);
    }
    private final static String MAPPING_TEMPLATE="{\n" +
            "  \"mappings\": {\n" +
            "    \"properties\": {\n" +
            "      \"id\": {\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"name\":{\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\"\n" +
            "      },\n" +
            "      \"price\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"stock\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"image\":{\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"index\": false\n" +
            "      },\n" +
            "      \"category\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"brand\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"sold\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"commentCount\":{\n" +
            "        \"type\": \"integer\",\n" +
            "        \"index\": false\n" +
            "      },\n" +
            "      \"isAD\":{\n" +
            "        \"type\": \"boolean\"\n" +
            "      },\n" +
            "      \"updateTime\":{\n" +
            "        \"type\": \"date\"\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}";
}

查询索引

    @Test
    public void getindex() throws IOException {
        //准备request对象
        GetIndexRequest request = new GetIndexRequest("pxy");
        //发送请求体
//        GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
//        System.out.println("返回参数"+response);
        //判断请求参数是否存在
        Boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println("exists="+exists);
    }

删除索引

@Test
    public void deleteindex() throws IOException {
        //准备request对象
        DeleteIndexRequest request = new DeleteIndexRequest("pxy");
        //发送请求体
        client.indices().delete(request, RequestOptions.DEFAULT);
    }

3.对文档进行操作

新增文档

@Test
void testAddDocument() throws IOException {
    // 1.准备Request对象
    IndexRequest request = new IndexRequest("pxy").id("1");
    // 2.准备Json文档
    request.source({}, XContentType.JSON);
    // 3.发送请求
    client.index(request, RequestOptions.DEFAULT);
}

查询文档

@Test
void testGetDocumentById() throws IOException {
    // 1.准备Request对象
    GetRequest request = new GetRequest("pxy").id("1");
    // 2.发送请求
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 3.获取响应结果中的source
    String json = response.getSourceAsString();
    System.out.println("json= " + json);
}

删除文档

@Test
void testDeleteDocument() throws IOException {
    // 1.准备Request,两个参数,第一个是索引库名,第二个是文档id
    DeleteRequest request = new DeleteRequest("pxy", "1");
    // 2.发送请求
    client.delete(request, RequestOptions.DEFAULT);
}

修改文档

修改一共两种方式:

  • 全量修改:本质是先根据id删除,再新增

  • 局部修改:修改文档中的指定字段值

在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:

  • 如果新增时,ID已经存在,则修改

  • 如果新增时,ID不存在,则新增

这里不再赘述,我们主要关注局部修改的API即可。

@Test
void testUpdateDocument() throws IOException {
    // 1.准备Request
    UpdateRequest request = new UpdateRequest("pxy", "1");
    // 2.准备请求参数
    request.doc(
            "price", 58800,
            "commentCount", 1
    );
    // 3.发送请求
    client.update(request, RequestOptions.DEFAULT);
}

批量处理文档

@Test
void testBulk() throws IOException {
    // 1.创建Request
    BulkRequest request = new BulkRequest();
    // 2.准备请求参数
    //新增文档
    request.add(new IndexRequest("items").id("1").source("json doc1", XContentType.JSON));
    request.add(new IndexRequest("items").id("2").source("json doc2", XContentType.JSON));
    //删除文档
    request.add(new DeleteRequest("items").id("2"));
    // 3.发送请求
    client.bulk(request, RequestOptions.DEFAULT);
}

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

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

相关文章

Dos.ORM简单说明

1 下载Dos.Tools-master 地址&#xff1a;Dos.Tool: 实体生成工具&#xff0c;成熟轻量级ORM、上手简单、性能高、功能强大&#xff01; 2 Dos.ORM仅支持DbFirst模式&#xff0c;即必须先有数据库&#xff0c;这里以Sql Server为例 3 新建项目&#xff0c;添加引用Dos.ORM.dll&…

3.javaweb-Servlet与过滤器

javaweb-Servlet与过滤器 文章目录 javaweb-Servlet与过滤器一、Servlet&#xff1a;server applet二、Servlet做了什么&#xff1f;三、Servlet是什么&#xff1f;四、jsp与Servlet关系五、Servlet API1.主要Servlet API介绍2.如何创建Servlet3.Servlet中主要方法4.ServletReq…

使用Docker快速本地部署RSSHub结合内网穿透访问RSS订阅源

文章目录 前言1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 前言 今天和大家分享的是如何在本地快速简单部署Rsshub工具&#xff0c;并结合cpolar内网穿透工具使用公网地址远…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

mobaxterm、vscode通过跳板机连接服务器

目标服务器&#xff1a;111.111.11.11 跳板机&#xff1a;100.100.10.10 1. mobaxterm通过跳板机连接服务器 1.1 目标服务器信息 1.2 跳板机信息 1.3 登录 点击登录&#xff0c;会输入密码&#xff0c;成功 参考&#xff1a;https://blog.csdn.net/qq_40636486/article/det…

Linux 运维 | 6.从零开始,Shell编程中正则表达式 RegExp 速成指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言概述 在 Linux 运维以及Shell脚本编程中往往会使用到各种文本处理工具&#xff08;例如&#xff0c;文本三剑客 awk、grep、sed&#xff09;以及Shell脚本编程&#xff08;后续作者会在#…

【C语言从不挂科到高绩点】23-指针05-结构体指针【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

CSS在线格式化、美化、压缩工具

网上有不少CSS格式化压缩的工具&#xff0c;但是不少站点有广告干扰&#xff0c;或操作起来不方便&#xff0c;或打开速度比较慢&#xff0c;所以自己定制了这个css格式化压缩的工具&#xff0c;也希望对大家有帮助&#xff0c;提供的这个CSS代码格式化和css在线压缩工具&#…

银发产业新闻 | 饿了么、一龄集团、达因药业、爱奇艺有哪些布局

一周银发产业大事件速览 9月27日 星期五 1 养老服务 国家医保局发布长护险编码规则民政部召开全国养老服务工作推进会议市场监管总局发布《适老家具通用技术要求》中央财政安排3亿元引导资金支持“老年食堂”发展全国老龄委印发《关于深入开展新时代“银龄行动”的指导意见…

行业标准如何立项?具体的步骤有哪些

一、前期准备 1. 明确需求&#xff1a; • 确定所在行业存在哪些问题或不足&#xff0c;需要通过制定行业标准来规范和解决。 • 分析行业发展趋势和市场需求&#xff0c;确保立项的标准具有前瞻性和实用性。 收集资料&#xff1a; 查阅国内外相关行业标准和法律法规&#xff0…

数字单总线输出的工业级温湿度一体传感器-MHT04

温湿度传感芯片 - MHT04&#xff0c;该芯片是数字单总线输出的工业级温湿度一体传感器&#xff0c;采用防尘防水透气的铂金叠层湿敏探头结合高精度电容调理芯片MDC04架构&#xff0c;数字单总线输出&#xff0c;可长距离串联多个节点&#xff0c;适用于仓储、冷链、畜牧、工农业…

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程&#xff0c;从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的&#xff0c;例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这十个数字)

题目分析&#xff0c;一共需要最多需要36个位置的数组&#xff0c;我们把前十个数组位置给0-9个数字字符存放空间&#xff0c;10-36的数组空间给到A-Z的存放 int main() {printf("请输入一串字符串内容,并且以#结束输入\n");char arr[36], ch;//26个大写字符10个数字…

力扣 中等 24.两两交换链表中的节点

文章目录 题目介绍题解 题目介绍 题解 利用25题K个一组反转链表链接 &#xff0c;将k改为2即可。 // 同 25题 K个一组反转链表 class Solution {public ListNode swapPairs(ListNode head) {// 统计节点个数int n 0;for (ListNode cur head; cur ! null; cur cur.next) {n…

【工具分享】Magniber勒索病毒解密工具

前言 Magniber勒索软件首次出现在2017年&#xff0c;最初主要针对韩国的用户。它是通过使用Magniber Exploit Kit (EK)传播的&#xff0c;这款勒索软件迅速成为网络威胁的一部分。尽管最初集中于亚洲地区&#xff0c;Magniber在2021年卷土重来&#xff0c;并开始扩展到全球范围…

扩展 SaaS 业务:2024 年取得成功的基本策略

在不断发展的数字世界中&#xff0c;软件即服务&#xff08;SaaS&#xff09;已成为关键要素&#xff0c;在不同领域提供了无与伦比的实用性和易用性。然而&#xff0c;在这个蓬勃发展的领域取得成功不仅仅需要创新的产品。仅仅具有可行性是不够的。要真正蓬勃发展&#xff0c;…

Redis桌面工具:Tiny RDM

1.Tiny RDM介绍 Tiny RDM&#xff08;Tiny Redis Desktop Manager&#xff09;是一个现代化、轻量级的Redis桌面客户端&#xff0c;支持Linux、Mac和Windows操作系统。它专为开发和运维人员设计&#xff0c;使得与Redis服务器的交互操作更加便捷愉快。Tiny RDM提供了丰富的Red…

基于Hive和Hadoop的保险分析系统

本项目是一个基于大数据技术的保险分析系统&#xff0c;旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

在 OpenEuler 中配置 KVM 虚拟化环境指南

本指南旨在为读者提供一个详细的步骤说明&#xff0c;帮助大家在 OpenEuler 系统中配置 KVM 虚拟化环境。无论您是初学者还是有一定经验的用户&#xff0c;这份指南都将涵盖从环境准备、安装到虚拟机管理的各个方面&#xff0c;确保您能够顺利地搭建并管理自己的虚拟化平台。 …

FOC电机驱动开发踩坑记录

关键技术 SVPWM电机磁场控制电流采样park变换和Clark变换滑膜观测器&#xff08;无感FOC&#xff09; SVPWM电机磁场控制 SVPWM主要思想是通过精确的对UVW三相电流的分时控制&#xff0c;来控制转子的合成力矩&#xff0c;达到目标方向&#xff0c;常用的是6分区的设计&…