分布式搜索引擎 ElasticSearch(ES)

news2024/12/31 6:18:40

一、初识elasticsearch

1.了解ES

1)elasticsearch的作用

elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容。elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK),被广泛应用在日志数据分析、实时监控等领域。而elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。

2)elasticsearch和lucene

elasticsearch底层是基于lucene来实现的。Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:https://lucene.apache.org/ 。

 3)elasticsearch与其他搜索技术对比

虽然在早期,Apache Solr是最主要的搜索引擎技术,但随着发展elasticsearch已经渐渐超越了Solr,独占鳌头 。

2.倒排索引

1)正向索引

如果是根据id查询,那么直接走索引,查询速度非常快。但如果是基于title做模糊查询,只能是逐行扫描数据,流程如下:

  1. 用户搜索数据,条件是title符合 "%手机%"
  2. 逐行获取数据,比如id为1的数据
  3. 判断数据中的title是否符合用户搜索条件
  4. 如果符合则放入结果集,不符合则丢弃。回到步骤1

逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

  • 优点:

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

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

  • 缺点:

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

2)倒排索引

倒排索引中有两个非常重要的概念:

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息。

  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条。

创建倒排索引是对正向索引的一种特殊处理,流程如下:

  • 将每一个文档的数据利用算法分词,得到一个个词条。

  • 创建表,每行数据包括词条、词条所在文档id、位置等信息。

  • 因为词条唯一性,可以给词条创建索引,例如hash表结构索引。

如图:

倒排索引的搜索流程如下(以搜索"华为手机"为例):

1)用户输入条件 "华为手机" 进行搜索。

2)对用户输入内容分词,得到词条:华为手机

3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。

4)拿着文档id到正向索引中查找具体文档。

如图:

 

虽然要先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。

  • 优点:

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

  • 缺点:

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

    • 无法根据字段做排序

3.es的一些概念

elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似之处。

1)文档和字段

elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中:

而Json文档中往往包含很多的字段(Field),类似于数据库中的列。

2)索引和映射

索引(Index),就是相同类型的文档的集合。

例如:

  • 所有用户文档,就可以组织在一起,称为用户的索引;

  • 所有商品的文档,可以组织在一起,称为商品的索引;

  • 所有订单的文档,可以组织在一起,称为订单的索引;

可以把索引当做是数据库中的表。数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。

3)mysql与elasticsearch

 两者各自有自己的擅长支出:

  • MySQL:擅长事务类型操作,可以确保数据的安全和一致性

  • Elastic Search:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用

  • 对安全性要求较高的写操作,使用mysql实现 

  • 对查询性能要求较高的搜索需求,使用elasticsearch实现

  • 两者再基于某种方式,实现数据的同步,保证一致性

4.安装es、kibana

详细可见:https://blog.csdn.net/yueyue763184/article/details/128138329?spm=1001.2014.3001.5501

二、索引库操作

索引库就类似数据库表,mapping映射就类似表的结构。要向es中存储数据,必须先创建“库”和“表”。

1.mapping映射属性

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

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

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

    • 数值:long、integer、short、byte、double、float、

    • 布尔:boolean

    • 日期:date

    • 对象:object

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

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

例如下面的json文档:

{
    "age": 21,
    "weight": 52.1,
    "isMarried": false,
    "info": "黑马程序员Java讲师",
    "email": "zy@itcast.cn",
    "score": [99.1, 99.5, 98.9],
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

对应的每个字段映射(mapping):

  • age:类型为 integer;参与搜索,因此需要index为true;无需分词器

  • weight:类型为float;参与搜索,因此需要index为true;无需分词器

  • isMarried:类型为boolean;参与搜索,因此需要index为true;无需分词器

  • info:类型为字符串,需要分词,因此是text;参与搜索,因此需要index为true;分词器可以用ik_smart

  • email:类型为字符串,但是不需要分词,因此是keyword;不参与搜索,因此需要index为false;无需分词器

  • score:虽然是数组,但是我们只看元素的类型,类型为float;参与搜索,因此需要index为true;无需分词器

  • name:类型为object,需要定义多个子属性

    • name.firstName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器

    • name.lastName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器

2.索引库的CRUD

统一使用Kibana编写DSL的方式来操作。

1)创建索引库和映射

基本语法:

  • 请求方式:PUT
  • 请求路径:/索引库名,可以自定义
  • 请求参数:mapping映射

例:

# 创建索引库
PUT /heima
{
    "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
        "type": "keyword",
        "index": false
      },
      "name": {
        "type": "object", 
        "properties": {
          "firstName":  {
            "type": "keyword"
          },
          "lastName":  {
            "type": "keyword"
          }
        }
      }
    }
  }
}

创建成功:

2)查询索引库

基本语法

  • 请求方式:GET

  • 请求路径:/索引库名

  • 请求参数:无

格式:GET /索引库名

 3)修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping。虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。

语法说明

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名": {
      "type": "integer"
    }
  }
}

4)删除索引库

语法:

  • 请求方式:DELETE

  • 请求路径:/索引库名

  • 请求参数:无

格式:DELETE /索引库名

5)总结

索引库操作有哪些?

  • 创建索引库:PUT /索引库名

  • 查询索引库:GET /索引库名

  • 删除索引库:DELETE /索引库名

  • 添加字段:PUT /索引库名/_mapping

三、文档操作

1.新增文档

语法:

 例:

POST /heima/_doc/1
{
    "info": "黑马程序员Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

2.查询文档

根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把文档id带上。

3.删除文档

删除使用DELETE请求,同样,需要根据id进行删除:

4.修改文档

修改有两种方式:

  • 全量修改:直接覆盖原来的文档

  • 增量修改:修改文档中的部分字段

1)全量修改PUT

全量修改是覆盖原来的文档,其本质是:

  • 根据指定的id删除文档

  • 新增一个相同id的文档

注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

例:

PUT /heima/_doc/1
{
    "info": "黑马程序员高级Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

2)增量修改POST

增量修改是只修改指定id匹配的文档中的部分字段。例:

POST /heima/_update/1
{
  "doc": {
   "email": "BuLiangShuai@itcast.cn"
  }
}

四、RestAPI

ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html

其中的Java Rest Client又包括两种:

  • Java Low Level Rest Client

  • Java High Level Rest Client

整合步骤简介:

1)引入es的RestHighLevelClient依赖:

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

2)因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

3)初始化RestHighLevelClient:

     初始化的代码如下:

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

JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。

索引库操作的基本步骤:

  • 初始化RestHighLevelClient

  • 创建XxxIndexRequest。XXX是Create、Get、Delete

  • 准备DSL( Create时需要,其它是无参)

  • 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete

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

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

相关文章

基于SSH的周报管理系统

来公司的第一个实习项目&#xff0c;前端使用的是Freemark,刚开始上手比较复杂&#xff0c;慢慢摸索也算是圆满完成了&#xff0c;加油&#xff01;

LockSupport与线程中断

LockSupport与线程中断 线程中断机制 voidinterrupt()中断此线程static booleaninterrupted()获取当前线程中断标志位 true|falsebooleanisInterrupted()获取当前线程中断标志位true|false static boolean interrupted&#xff08;&#xff09;和boolean isInterrupted&#x…

【unity】安卓环境配置(踩坑整理)

一、基础环境配置 1、模块安装 可能报错&#xff1a;Currently selected scripting backend (IL2CPP) is notinstalled. 解决&#xff1a;部分项目依赖于IL2CPP&#xff0c;及WebGL组件&#xff0c;因此也需要勾上。 2、打开偏好设置 3、设置需要的VS版本 可能报错&#xf…

Linux动态库与静态库

Linux动态库与静态库 文章目录Linux动态库与静态库1.库的概念、种类与使用2.链接简述2.1 链接过程理解2.2 静态链接与动态链接概念2.3 静态链接与动态链接的例子3.动态库与静态库的生成方法3.1 静态库的生成3.2 静态库的打包3.2 静态库的使用3.3 动态库的生成3.4 动态库的打包3…

[附源码]JAVA毕业设计基于web的面向公众的食品安全知识系统(系统+LW)

[附源码]JAVA毕业设计基于web的面向公众的食品安全知识系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

设备发现:通向全面网络可见性的途径

想实现企业网络安全防护&#xff0c;它首先需要完全了解其网络中发生的所有事件。有了这种可见性&#xff0c;企业网络安全管理员可以分析用户在网络环境中进行了哪些危险的操作&#xff0c;并采取必要的应对措施来主动保护企业网络免受攻击。 日志取证 但是&#xff0c;如果攻…

Java 每日一练 (7)

Java每日一练(7) 单选 1. JAVA属于&#xff08; &#xff09;。   A 操作系统 B 办公软件 C 数据库系统 D 计算机语言 答案 &#xff1a; java 是属于一门语言&#xff0c;是 计算可以识别的语言&#xff0c; 所以 答案 D 2. 类声明中&#xff0c;声明抽象类的关键字是 ( …

9.HTTP协议

通信有三要素&#xff0c;分别是通信的主体(通信的双方是谁)&#xff0c;通信的内容&#xff0c;通信的方式(打电话&#xff0c;写信这种)| 通信协议是通信双方完成通信所必须遵守的规则和约定 网页内容叫做超文本(HyperText)&#xff0c;网页内容的传输协议叫做超文本传输协…

JDSU故障测试仪维修OTDR光时域反射仪维修MTS2000

应用范围&#xff1a;邮电通信工程与维护&#xff0c;有线电视工程与维护&#xff0c;光缆制造商&#xff0c;光纤综合布线系统。 功能特点&#xff1a; 结构紧凑&#xff0c;重量轻&#xff0c;高度集成 已经可以支持40多个应用模块 有IL/ORL、OTDR、PMD、CD 或WDM 插拔模…

忆享科技聚焦|数字经济、网络安全、5.5G、数字火炬手……热点资讯一览

“忆享聚焦”栏目第十期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1. 工信部&#xf…

十三、Vue CLI(1)

本章概要 简介安装创建项目 vue create使用图形界面 在开发大型单页面应用时&#xff0c;需要考虑项目的组织结构、项目构建、部署、热加载、代码单元测试等多方面与核心业务逻辑无关的事情&#xff0c;对于项目中用到的构建工具、代码检查工具等还需要一遍一遍地重复配置。…

大数据技术——结合Flume官方理解常用组件

Flume的常用组件包括Event和Agent。Agent又包含了Source、Channel以及Sink&#xff0c;本片文章将从官方说明文档入手&#xff0c;详细描述各组件以及组件的属性和功能。 文章目录1 常用的Source类型描述1.1 Netcat Source1.2 Exec Source1.3 Spooling Directory Source1.4 Tai…

【SQL】redo log | undo log

【SQL】日志redo日志和undo日志REDO LOGredo的整体流程UNDO LOG小结redo日志和undo日志 REDO LOG 称为重做日志&#xff0c;提供再写入操作&#xff0c;恢复提交事务修改的页操作&#xff0c;用来保证事务的持久性。 事务提交后&#xff0c;刚写完缓冲池&#xff0c;数据库宕…

Linux 必知必会

一、Linux 简介 Linux 与 Windows 和 Mac OS 等系统一样&#xff0c;它也是一个操作系统&#xff0c;并且是一个开源的类 unix 操作系统。凭借着其免费、安全、高稳定性等特点&#xff0c;被广泛应用于服务器、嵌入式开发等领域&#xff0c;并且在服务器领域一枝独秀&#xff0…

docker-compose Install Prometheus

前言 Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上…

蒙代尔-弗莱明模型

蒙代尔-弗莱明模型 – 潘登的宏观经济学笔记 文章目录蒙代尔-弗莱明模型 -- 潘登的宏观经济学笔记IS-LM-BP蒙代尔-弗莱明模型资本完全流动固定汇率制度浮动汇率制资本完全不流动固定汇率制浮动汇率制资本不完全流动(KA主导&#xff0c;BP斜率小)固定汇率制浮动汇率制资本不完全…

代码随想录刷题|买卖股票问题的总结

目录 总结 121.买卖股票的最佳时机 问题描述 特点分析 动态规划思路 122.买卖股票的最佳时机Ⅱ 问题描述 特点分析 动态规划思路 123.买卖股票的最佳时机III 问题描述 特点分析 动态规划思路 188.买卖股票的最佳时机IV 问题描述 特点分析 动态规划思路 309.最…

tictoc例子理解 16-18

tictoc16-18tictoc 16 全局信号signaltictoc 17 在仿真界面幕布上显示总条数信息tictoc 18tictoc 16 全局信号signal 前一步的主要问题是&#xff0c;如果我们想要更改所收集的统计信息&#xff0c;就必须修改模型的代码。统计计算深入到模型代码中&#xff0c;很难修改和理解…

大型扫码点餐小程序系统源码

1. 开发语言&#xff1a;JAVA 2. 数据库&#xff1a;MySQL 3. 原生小程序 4. Sass 模式 5. 带调试视频 6. 可付费调试服务 扫码点餐小程序管理端&#xff1a; 数据统计&#xff1a;今日订单、堂食、预约、外卖、储值 堂食订单&#xff1a;订单号、商家、门店、类型、会员、桌位…

Spring进阶(二十)之事件处理

目录 为什么需要使用事件这种模式 事件模式中的几个概念 使用事件模式实现上面用户注册的业务 事件对象 事件监听器 事件广播器 事件广播默认实现 自定义用户注册成功事件类 用户注册服务 下面我们使用spring来将上面的对象组装起来 测试用例模拟用户注册 添加注册…