分布式搜索引擎 ElasticSearch(ES)

一、初识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

不凉帅
关注 关注
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
weixin_49794051的博客
11-13 827
面试题 ES 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s ,坑爹了。第一次搜索的时候,是 5~10s ,后面反而就快了,可能就几百毫秒。 你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你
Elasticsearch
qq_55682798的博客
08-15 1387
概念:用户输入想要的关键词,返回含有该关键词的所有信息。场景:1互联网搜索:谷歌、百度、各种新闻首页2站内搜索(垂直搜索):企业OA查询订单、人员、部门,电商网站内部搜索商品(淘宝、京东)场景。...
Elasticsearch入门
LF991的博客
06-25 929
Elasticsearch
Elasticsearch搜索引擎
最新发布
qq_63161848的博客
08-28 1673
Elasticsearch简称ES,是一个开源的实时分布式搜索和分析引擎。它具有快速、可扩展、强大的全文搜索功能,可以用于存储、搜索和分析大规模的数据。ES可以处理大量的数据并提供实时的搜索结果,适用于各种应用场景,包括日志分析、全文搜索、数据可视化等。它使用分布式架构来实现高可用性和容错性,并提供简单的RESTful API和丰富的查询语法来进行数据的索引和搜索。
Elasticsearch学习,请先看这一篇!
热门推荐
铭毅天下Elasticsearch
08-18 23万+
题记:Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识、原理从初学者认知、学习的角度,从以下9个方面进行详细梳理。欢迎讨论……0. 带着问题上路——ES是如何产生的?(1)思考:大规模数据如何检索?如:当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题: 1)用什么数据库好?(mysql、sybase、oracle、达
es分布式搜索引擎
08-14
es分布式搜索引擎,包括es分布式搜索引擎的傻瓜式安装和原理解释
分布式搜索引擎ElasticSearch思维导图
11-17
分布式搜索引擎ElasticSearch思维导图,ES思维带图。分布式搜索引擎ElasticSearch思维导图,ES思维带图。分布式搜索引擎ElasticSearch思维导图,ES思维带图。分布式搜索引擎ElasticSearch思维导图,ES思维带图。...
分布式搜索引擎Elasticsearch开发实战基础篇
06-09
**分布式搜索引擎Elasticsearch开发实战基础篇** 在信息化飞速发展的时代,数据量激增,传统的数据库查询方式已经无法满足高效、实时的数据检索需求。此时,分布式搜索引擎Elasticsearch应运而生,它以其强大的...
分布式搜索引擎Elasticsearch开发实战基础篇 (ElasticSearch、ELK、搜索引擎、Lucene).rar
11-11
分享一套完整版视频课程——分布式搜索引擎Elasticsearch开发实战基础篇 (ElasticSearch、ELK、搜索引擎、Lucene),本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎搜索引擎的...
微服务 SpringCloud :分布式搜索引擎-Elasticsearch
07-13
elasticsearch是一款非常强大的开源搜索引擎,支持的功能非常多 【项目介绍】 1、该项目是个人高分项目源码(文档+源码),已获导师指导认可通过,答辩评审分达到96分。 2、该资源内项目代码都经过测试运行成功,...
es搜索引擎s
06-23
Java搜索引擎
ES搜索引擎
小白初见
12-25 3937
ES搜索引擎ElasticSearch) 简介 ES是一个开源的高扩展的分布式全文搜索引擎。他可以提供实施存储,检索数据。可以配置到多台服务器上,最大可处理PB级别的数据。ES也是用Java开发,以Lucene作为核心来实现索引和搜索功能。目前,很多知名的互联网厂商如阿里、新浪、百度等,都在使用ES搜索引擎 ElasticSearch与Solr ElasticSearch自身内带了分布式管理功能...
es搜索引擎
w2767526928的博客
05-11 869
配置 """ es 引擎相关 """ from elasticsearch import Elasticsearch es = Elasticsearch("http://101.42.224.35:9200/") class ES(object): """ es 对象 """ def __init__(self, index_name: str): self.es = es self.index_name = index_name def get_doc(self, ui
分布式搜索引擎 elasticsearch
KYGALYX的博客
02-07 3170
分布式搜索引擎 elasticsearch 第一部分 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的车 1.1.2.ELK技术栈 elasticsearch结合kibana、Logstash、Beats,也就是elasti
写文章

热门文章

  • Navicat远程连接MongoDB最全解决方法(教程、报错) 19072
  • SpringBoot整合minio服务(超详细) 16913
  • JSP中文乱码问题与解决方法 14358
  • IDEA打开单个或多个jsp文件(最全指导) 10777
  • Nginx反向代理服务器搭建(超详细) 9171

最新评论

  • SpringBoot整合minio服务(超详细)

    冬天vs不冷: 写的非常详细,是一篇优质博客,干货满满,让我有了全新的认识,感谢博主分享,让我学到了很多,支持支持。欢迎大佬来我这参观~

  • SpringBoot整合minio服务(超详细)

    21光年: 博主,最新版本的minio依赖变了,用你的好像搞不了了。

  • IDEA打开单个或多个jsp文件(最全指导)

    Sea__hh: 博主,我的javaScript没有我自己写的jsp文件怎么办表情包

  • SpringBoot整合minio服务(超详细)

    l502781238: io.minio.errors.InvalidResponseException: Non-XML response from server 有人遇到这个问题了吗

  • Java听潮阁(SpringCloud项目)

    不凉帅: 已开源

最新文章

  • ERNIESpeed-128K在线智能聊天机器人项目(附源码)
  • IDC基础学习笔记
  • 前后端分离的security角色权限实现
2024年3篇
2023年26篇
2022年74篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳坪山网站建设公司云平台网站优化黄山网站seo优化软件多少钱外贸网站优化费用多少网站优化天天软文专业黄平网站优化优化网站制作蚌埠网站首页优化哪里有汕尾网站优化咨询热线合肥企业网站优化方案安阳网站优化企业网站优化怎么收费南昌网站优化技术医疗网站优化公司宣城网站排名优化哪家有实力寿光优化网站软件奎屯网站优化排名网站信息流优化教程石家庄优化网站界面深圳搜索引擎网站优化营销关键词优化网站四川模板网站建设优化潜江市网站关键词优化推广河北网站优化托管收费随州市网站线上推广优化少儿培训网站优化运营网站优化服务商崇川区网站优化哪家好乐山网站优化公司江油网站建设和优化服务福建南平网站优化公司香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化