ElasticSearch总结1

目录

一、ElasticSearch介绍:

举例一:

举例二:

举例三:

二、ELK技术栈

三、Elasticsearch 的基本概念:

四、正向索引和倒排索引:

正向索引:

倒排索引:

五、Mysql和Elasticsearch对比

六、安装单体ES和kibana、IK分词器

为什么要去安装kibana:

为什么要去安装IK分词器:

代码:

代码: 

代码: 

IK分词器拓展词库:

ik分词器-停用词库 :

 七、Mapping属性详细介绍:

mapping常见的属性: 

注意事项: 


一、ElasticSearch介绍:

        ElasticSearch是一个非常强大的开源搜索引擎。它可以帮助我们从海量数据中快速的找到所需要的内容。这个搜索引擎可以用来实现搜索、日志、统计分析等监控等等功能。

        而且这个索引擎是一个分布式的搜素引擎,它能够支持这种水平的扩展,形成集群

  ElasticSearch的底层实现是基于Lucene技术。Lucene是一个java语言的搜索引擎,Lucene是Apache公司的一个顶级项目,而ElasticSearch,正是基于这个Lucene去做的二次开发

        Lucene是apache公司的一个搜索引擎类库,也就是一个jar包,里面有里面有各种各样的a p i.

        将来在mysql里边我们sql写好了,通过这个connection,把这个东西给它发出去,发给mysql,mysql是不是就处理了?那在ES当中呢,你写了DSL以后,你要通过什么发出去呢?是基于h t t p的请求发出去的,为什么呢?因为在我们ES里,它对外暴露的是Restful接口嘛,这种接口的处是跟语言无关。也就是说你任何的语言,你只要能发h t t p请求,你都可以把你的DSL发给我,我就能处理了。

        这样一来,他就彻底脱离了语言的束缚了

举例一:

        例如去github网站上搜索一些仓库, 当你去搜索的时候,它不仅仅能够把相关仓库给你搜出来,还能够把你所搜索的这个关键字,它所在的这个代码也给你高亮展示出来:

举例二:

        京东上买东西,输入商品的信息,立马能够搜索出跟你输入关键字有关的这些商品,并且高亮显示:

举例三:

        google搜索代码报错的异常信息:

二、ELK技术栈

        Elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域:

  • elasticsearch是elastic stack的核心,负责数据的搜素、分析和运算
  • Logstash、Beats, 这两个组件主要是来负责数据抓取的。比如说你的日志数据,就可以由他来去抓取。  
  • kibana是一个数据可视化的组件。将来搜索出来的数据要展示,可以用它来去展示,形成报表

        例如百度、京东在展示结果的时候,都有自己的网站,所以这种可视化不一定非得用这个kibana去做。你完全可以自己去实现;数据抓取也一样,我们完全可以自己写java代码,自己从数据库中获取数据。然后往ElasticSearch里去写

        所以kibana、Logstash、Beats,它们都是可替换的一个组件,官方提供给你,你想用就用,你不用也没关系,但是不可替代的就是ElasticSearch。

三、Elasticsearch 的基本概念:

(1)index 索引:索引类似于数据库中的表,Elasticesearch 中的索引是存储数据的地方,索引就是相同类型文档的集合。

(2)映射(mapping)︰索引中文档的字段约束信息(字段名、数据类型)类似表的结构约束;每个索引库都应该有自己的映射 

(3)type 类型:类型是用来定义数据结构,可以认为是 mysql 中的一张表,type 是 index 中的一个逻辑数据分类

(4)document 文档:类似于 MySQL 中的一行。文档是es中的最小数据单元,每一条数据就是一个文档,ES中的文档是jason风格的

(5)词条:使用分词器对文档中的内容分词,得到的词语就是词条

(6)Field 字段:Field是Elasticsearch的最小单位,一个document里面有多个field

(7)shard 分片:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个分片,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。

(8)replica 副本:任何服务器随时可能故障或宕机,此时 shard 可能会丢失,通过创建 replica 副本,可以在 shard 故障时提供备用服务,保证数据不丢失,另外 replica 还可以提升搜索操作的吞吐量。

        shard 分片数量在建立索引时设置,设置后不能修改,默认5个;replica 副本数量默认1个,可随时修改数量;

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

   (10)分词器的作用: ①、创建倒排索引时对文档分词;  ②、用户搜索时, 对输入的内容分词

四、正向索引和倒排索引:

正向索引:

        比方说我这里有一张数据库表,那我们知道对于数据库它一般情况下都会基于i d去创建索引,然后形成一个b+树,当用户根据id(索引字段)进行检索的速度非常快,但是当用户进行局部内容检索,模糊查询的时候,索引将会失效,这时候数据库只能采用逐条扫描的方式来判断每一行数据中是否包含用户搜素的内容,包含的话就存入查询结果集,当数据库中的存储了海量数据的时候,逐条检索的效率非常低,性能非常差,这就是正向索引:

         搜索'手机":

        select *from tb_goods where title like'%手机%'

倒排索引:

         ①、倒排索引,ES在存储文档时,它首先会先对文档的内容按照词义分成一个一个不同词条,对词条创建索引,并记录词条所在文档的id;

        ②、当我们去做搜素、查询的时候会涉及到两次查询:第一次查询是先根据用户输入的内容按照词义分成一个个词条,然后去词条列表中进行搜素,找到对应的文档id,由于所有的词条都建立了索引,所以基于词条来查询文档id的速度是非常快的;第二次查询是拿着文档id找到具体文档,再存入查询结果集,返回给前端。

         ③、虽然经历了两次搜查询,但每一次都是根据索引进行查询,所以总的查询效率是比传统的正向索引:逐条扫描要高很多,时间复杂度是O(1),极大的提高了检索效率。

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

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

五、Mysql和Elasticsearch对比

        Mysql和Elasticsearch擅长的事情是不一样的。MySQL支持事务,它更擅长的是事物类型的操作:因为事物里边有ACID的原则,所以它是可以确保数据的ACID 安全性、一致性

        ES没有事物的概念,所以它无法保证数据的ACID,它更擅长的是数据的搜索、分析和运算。

        所以它们两个是各司其职的。如果你的业务对数据的安全性、一致性要求很高,你就应该使用mysql去做数据存储。  如果你的业务涉及到了海量数据的搜素、面对比较复杂的搜素业务场景,就是用ES。

六、安装单体ES和kibana、IK分词器

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

为什么要去安装kibana:

        为什么还要去安装kibana? 因为kibana里边提供了一个dev tools工具,可以让我们非常方便的去编写ES中的DSL语句,发送DSL语句,从而去操作ES,它的本质其实就是发送一个Restful的请求到ES当中。

        安装单体ES和kibana、IK分词器具体看我这篇博客:

Docker安装部署ElasticSearch-CSDN博客

        我们刚刚在创建Kibana容器的时候,指定了ES的地址,所以这里你把DSL语句准备好,请求方式和路径准备好,kibana就帮你把这个DSL发给ES,很方便,你不用去指定ES的ip地址和端口号了: 

GET /:判断ES是否连接

       

为什么要去安装IK分词器:

        ES在创建倒排索引时,需要对文档内容进行分词。而且我们在去搜索时需要对用户输入的内容也去做分词。分词就需要对中文或者是英文的语义进行分析,按照词语含义进行拆分。这种拆分其实是比较复杂的,需要有特殊的算法去支持,但默认的分词规则对中文处理并不友好:

代码:

POST /_analyze
{"analyzer": "standard","text": "猪大肠吃起来good!"
}

{"tokens" : [{"token" : "猪","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "大","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "肠","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "吃","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "起","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4},{"token" : "来","start_offset" : 5,"end_offset" : 6,"type" : "<IDEOGRAPHIC>","position" : 5},{"token" : "good","start_offset" : 6,"end_offset" : 10,"type" : "<ALPHANUM>","position" : 6}]
}

        处理中文分词,一般会使用IK分词器, ik分词器包含两种模式:

  •          ik_smart:        最少切分,粗粒度
  •          ik_max_word: 最细切分,细粒度
代码: 

POST /_analyze
{"analyzer": "ik_max_word","text": "程序员太棒了"
}
{"tokens" : [{"token" : "程序员","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "程序","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 1},{"token" : "员","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 2},{"token" : "太棒了","start_offset" : 3,"end_offset" : 6,"type" : "CN_WORD","position" : 3},{"token" : "太棒","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 4},{"token" : "了","start_offset" : 5,"end_offset" : 6,"type" : "CN_CHAR","position" : 5}]
}
代码: 

POST /_analyze
{"analyzer":"ik_smart","text": "程序员太棒了"
}

      ik_smart是粗力度切分:它会从字数最多开始往字数越来越少去看,首先看五个字是不是一个词,如果不是,我再看四个,如果还不是,再看三个,如果发现程序员这三个字刚好是一个词,我就不再继续往下看两个字是不是词。

      ik_max_word分出来有三个词: 程序、程序员、员,那用户搜索的时候,我无论输入 程序、程序员还是员,这三个词中的任意一个都能搜这个文档,但是如果你采用的是ik_smart,你分出来只有程序员这一个词,那搜到的概率就会比较低。

      ik_smart优缺点:分的词少了,占用的内存空间就小一些,将来内存里可以缓存更多的数据。但是被搜到的概率就会比较低

        ik_max_word优缺点:占用内存空间会更多,被搜索到的概率更大 

思考:

      IK分词器它底层分词的原理到底是什么? 他怎么知道程序员这三个字合在一起是一个词呢? 它的底层一定会有一个字典,在这个字典里边一定会有各种各样的词语,提前在里边就罗列了。当他要分词的时候,他肯定是拿着这些字去匹配,看那个词典里有没有。如果匹配到发现这俩在里边有证明它是个词,那就把它分出来。所以不管是IK分词器,还是其他的中文分词器,它都会依赖于一个字典来去做分词。但这个字典不可能罗列出所有的词语,因为每年都有网络词语诞生:

POST /_analyze
{
  "analyzer":"ik_smart",
  "text": "奥里给"
}

        ”的、啊、呢“这样的词语,这种词分类没有什么意义,还有一些敏感词汇,比如说国家领导人的名字或者禁忌、一些毒品之类的,要把它禁掉, 所以ik分词器能不能实现这种字典的个性化设置呢,能!

IK分词器拓展词库:

          IK分词器支持这种词库的拓展。拓展方式是找到它的config目录下的:

ik分词器-停用词库 :

步骤: 

  打开以后呢,在这里大家可以看到,这个就是扩展字典,这个是停止词:

这两个其实是文件名:

        也就是说拓展字典要来读这个文件,停止词字典要来读这个文件。

 这个两个文件在哪呢?它是在当前配置文件所在目录,在这个目录里面把这两个文件新建起来:

                                

                         

        这个文件打开之后就有英文里边的一些冠词介词之类的、无意义的词语。我们也可以把咱们中文的一些无意义词语、语气词、禁用词加进去:

                

配置好了以后,重启让它生效:

               docker  restart  es

 七、Mapping属性详细介绍:

        映射(mapping)︰索引中文档的字段约束信息(字段名、数据类型)类似表的结构约束;每个索引库都应该有自己的映射          

        数据库一定要先创建表才能去添加数据。ES里面也一样,你得先有了索引库才能往里边去添加文档,要想去创建一个索引库,就像建表一样,建表语句里面是要指定个schemer,也就是对字段的一些约束。我们的索引库它在创建时需要去指定对应的mapping映射: 对文档的约束。

mapping常见的属性: 

       ES中的文档是jason风格的,作为一个jason,它里面要么是数值,要么是布尔值,要么是字符串,要么数组,要么是对象嵌套。这些类型对应到我们的这个ES中都有对应的一个类型去进行约束:

注意事项: 
  • text是可分词的文本,比如说我这里的info,info是个人信息;
  • keyword是精确值,它只有合在一起才有意义,不能拆开,如邮箱;
  • index代表是否创建倒排索引,为true,就会给你创建倒排索引,就可以参与搜索了,如果说这儿给了false,就不会倒排索引,就没有办法去搜索这个字段。 它的默认值就是ture,也就是说你在做字段映射时,如果你不去设置index,默认所有的字段都会被创建倒排索引,将来每个字段都可以参与搜索。
  • 我们在实际开发的过程中,不是所有的字段都需要搜索,比如邮箱、商品的图片是一个url地址,没有搜索意义。

  • analyzer其实是结合text类型去用的,所有数据类型里,只有text类型需要分词,其他所有类型都无需分词

  • 在ES当中是没有数组这种类型,但是它允许你某一个类型的字段有多个值,比如说你是一个部门类型,但是你里边有多个值没问题,数据类型要一致

                                

       Object将来要结合Properties声明子字段 ,Properties是该字段的子字段。例如name有两个子属性:firstName 、 lastName, 将来我就可以用property来指定name的子属性:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        

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

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

相关文章

新版本Qt Creator安装配置

新版本Qt Creator安装配置 文章目录 新版本Qt Creator安装配置1、前言2、环境3、安装配置4、总结 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt是一个跨平台的C应用程序开发框架&#xff0c;而Qt Creator是专为Q…

免费的单片机物联网MQTT平台选择

目的是多设备接入中控&#xff0c;平台只做转发。 选择巴法云&#xff1a;巴法科技&巴法云-巴法设备云-巴法物联网云平台 clientId是私钥uid&#xff1a; 多设备 clientId 填同一个 uid 都是可以的。平台应该是加了后缀区分。 支持自定义topic&#xff0c;操作简单&#x…

Spring ai 快速入门及使用,构建你自己的ai

第一步&#xff1a;创建springboot项目 jdk必须是17及以上 1.8用不了 第二步 选择web和ai的依赖 选择openai 第三步 需要配置openai key 配置 分享个免费或的apikey的地方New API 会免费赠送1刀的token spring.application.namespringAI spring.ai.openai.base-urlhttps://ap…

esp32学习

开启自动补全功能 Arduino IDE 2.0开启代码补全及修改中文_arduino ide怎么设置中文-CSDN博客 PWM 、 ADC转换 在使用这个adc默认配置的时候adc引脚的输入电压必须是介于0-1之间&#xff0c;如何高于1v的电压都会视为一个最高值&#xff0c;如果要增加测量电压你就需要配置一…

Flexible布局在Web前端开发中的实际应用

随着Web前端技术的不断发展&#xff0c;Flexible布局&#xff08;弹性布局&#xff09;已成为现代网页设计中不可或缺的一部分。它提供了一种高效、灵活的方式来组织和管理页面元素&#xff0c;使开发者能够轻松应对各种复杂的布局需求。本文将通过一个实际的应用案例来介绍Fle…

Protobuf 通信协议

Protobuf Protobuf 简介使用技术内幕 Protobuf 简介 在移动互联网时代&#xff0c;手机流量、电量是最为有限的资源&#xff0c;而移动端的即时通讯应用无疑必须得直面这两点 解决流量过大的基本方法就是使用高度压缩的通信协议&#xff0c;而数据压缩后流量减小带来的自然结…

PyCharm更换pip源、模块安装、PyCharm依赖包导入导出

一、Pycharm更换安装源 在下载安装好Pycharm后&#xff0c;一个在实际编程开发过程中非常重要的问题是第三方库添加&#xff0c;然而Python默认的源网络速度有点慢&#xff0c;因此&#xff0c;我们常常需要做的是更换Pycharm的安装源。 在当前最新版&#xff08;2022.03版&…

C++三大特性及应用

C三大特性 面向对象程序设计&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。在OOP中&#xff0c;对象是类的实例&#xff0c;类包含数据&#xff08;属性&#xff09;和可以对数据执行操作的方法&#xff08;行为&#xff09;。 面向对象的…

jupyter notebook设置代码自动补全

jupyter notebook设置代码自动补全 Anaconda Prompt窗口执行 pip install jupyter_contrib_nbextensionsjupyter contrib nbextensions install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user按如下图片设置 卸载jed…

线上剧本杀小程序:创新玩法下带来的市场活力

近几年来&#xff0c;剧本杀作为一种新型的游戏娱乐模式&#xff0c;深受年轻人的喜欢&#xff0c;成为了当下年轻人娱乐休闲的主要方式之一。剧本杀行业在经历过一段时间的“野蛮生长”后&#xff0c;游戏内容和服务得到的升级发展&#xff0c;游戏的趣味性和体验感也逐渐增强…

C#基础之冒泡排序

排序初探 文章目录 冒泡排序1、概念2、冒泡排序的基本原理3、代码实现思考1 随机数冒泡排序思考2 函数实现排序 冒泡排序 1、概念 将一组无序的记录序列调整为有序的记录序列&#xff08;升、降序&#xff09; 2、冒泡排序的基本原理 两两相邻&#xff0c;不停比较&#x…

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 合并两个有序链表我们的思路是创建一个新链表&#xff0c;然后遍历已知的两个有序链表&#xff0c;并比较其节点的val值&#xff0c;将小的尾插到新链表中&#xff0c;然后继续遍历&#xff0c;直到将该两个链表…

【STM32】F4使用通用定时器输出可变PWM方法

网上的文章太啰嗦&#xff0c;这里直接开始。 使用的是STM32CubeIDE&#xff0c;HAL。以通用定时器TIM12在 通道2上输出1KHz的PWM为例。 要确定输出的引脚、定时器连接在哪里。 TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2…

使用groovy+spock优雅的进行单测

使用groovyspock优雅的进行单测 1. groovyspock示例1.1 简单示例1.2 增加where块的示例1.3 实际应用的示例 2. 单测相关问题2.1 与SpringBoot融合2.2 单测数据与测试数据隔离2.3 SQL自动转换&#xff08;MySQL -> H2&#xff09; 参考 Groovy是一种基于JVM的动态语言&#x…

Java的逻辑控制和方法的使用介绍

前言 程序的逻辑结构一共有三种&#xff1a;顺序结构、分支结构和循环结构。顺序结构就是按代码的顺序来执行相应的指令。这里主要讲述Java的分支结构和循环结构&#xff0c;由于和C语言是有相似性的&#xff0c;所以这里只会提及不同点和注意要点~~ 注意在C语言中&#xff0c;…

日本软文发稿:成功的关键与应注意之事项

在当今的营销环境中&#xff0c;产品和服务如何被消费者所知&#xff0c;和品牌如何被市场所接受&#xff0c;软文发稿扮演了极其重要的角色。对于希望在日本市场拓展业务的企业来说&#xff0c;了解和熟悉日本的软文发稿尤其关键。 一&#xff0c;优秀的媒体平台 日本拥有众…

「玻尔曾孙」领衔!超辐射原子,重塑全球精准测时——

超辐射原子能够帮助我们以前所未有的精度测量时间。在哥本哈根大学最近的一项研究中&#xff0c;研究人员开发了一种新的测量时间间隔&#xff08;秒&#xff09;的方法&#xff0c;这种方法克服了目前最先进原子钟面临的一些限制。 这一成就有望在多个领域产生深远影响&#x…

代码随想录Day 36|Python|Leetcode|01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包问题&#xff0c;你该了解这些&#xff01; 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 代码随想录 (programmercarl.com) 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j] 表示从下标为[0-i]的物品里…

「笔试刷题」:求最小公倍数

一、题目 输入描述&#xff1a; 输入两个正整数A和B。 输出描述&#xff1a; 输出A和B的最小公倍数。 示例1 输入&#xff1a; 5 7 输出&#xff1a; 35 示例2 输入&#xff1a; 2 4输出&#xff1a; 4二、思路解析 这道题&#xff0c;也是模拟实现这一大类的一题…

Unity 递归实现数字不重复的排列组合

实现 private void Permutation(List<int> num, int leftIndex, List<string> strs) {if (leftIndex < num.Count){for (int rightIndex leftIndex; rightIndex < num.Count; rightIndex){Swap(num, leftIndex, rightIndex);Permutation(num, leftIndex 1…