ElasticSearch
- 一、ElasticSearch基本概念
- 1.ElasticSearch是什么?从哪来、来干啥?
- 2.ElasticSearch与Solr的对比与选型:
- 3.ES核心概念及相关操作
- 4.ELK:拆箱即用的技术,解压完成就能用
- 5.IK分词器
- 6.ElasticSearch与SpringBoot集成
- 二、ElasticSearch实操
- 巨人的肩膀
一、ElasticSearch基本概念
1.ElasticSearch是什么?从哪来、来干啥?
- ElasticSearch
- ElasticSearch是一个实时分布式搜索和分析引擎【开源的高扩展的分布式全文搜索引擎,
可以近乎实时的存储、检索数据
。但是ElasticSearch目的是通过简单的RESTful API来隐藏Lucene的复杂性。】。它让你以前所未有的速度处理大数据成为可能。它用于全文搜索、结构化搜索、分析以及将这三者混合使用。
- SQL也可以做查询,比如like &yaochadexinxi%,进行模糊查询,但是如果数据量很大时,查询就很慢,原来通过索引可以优化查询速度,但是感觉依旧是治标不治本。所以就能用上ElasticSearch来进行搜索功能的实现
- 后期,咱们就可以把所有要查询的数据全部用爬虫爬出来,或者从数据库中拿出来放到ES中
- Lucene和ElasticSearch
ElasticSearch是基于Lucene做了一些封装和增强。Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎
- Lucene只是一套信息检索包,就是一个jar包,不包含啥搜索引擎,把jar导进来就能用。无论在开源还是专有领域, Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用Lucene,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更槽糕的是, Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单
。
- ElasticSearch是一个实时分布式搜索和分析引擎【开源的高扩展的分布式全文搜索引擎,
2.ElasticSearch与Solr的对比与选型:
- ElasticSearch
Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架
。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es.
- Solr
- Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器【
solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene
】。Solr提供了比Lucene更为丰富的查询语言【它对外提供类似于Web-service的API接口】,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 - Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中
Solr索引的实现方法很简单,用POST方法向Solr服务器发送一个描述Field及其内容的XML文档, Solr根据xml文档添加、删除、更新索引
。Solr 搜索只需要发送HTTP GET请求,然后对Solr返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能, Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。- 用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。
- Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器【
- 如何选择ElasticSearch和Solr,或者说如何做技术选型
- 当实时建立索引时,Solr 会产生io阻塞,查询性能较差,Elasticsearch具有明显的优势。
- 随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。
- 转变我们的搜索基础设施后,可以得知从Solr到Elasticsearch搜索性能提高50多倍!
- es基本是开箱即用(解压就可以用|) , 非常简单。Solr安装略微复杂一丢丢!
- Solr 利用Zookeeper进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能。
- Solr 支持更多格式的数据,比如SON、XML、CSV ,而Elasticsearch仅支持json文件格式,够用了。
- Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
- Solr 查询快,但更新索引时慢(即
Solr 插入删除慢
) , 用于电商等查询多的应用;ES建立索引快(即ES查询慢) ,即实时性查询快,用于facebook新浪等搜索
。Solr是传统搜索应用的有力解决方案,但Elasticsearch 更适用于新兴的实时搜索应用
。
- Solr比较成熟, 有一个更大,更成熟的用户开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
3.ES核心概念及相关操作
https://www.elastic.co/guide/en/welcome-to-elastic/current/getting-started-general-purpose.html
:- ES是面向文档的
- 文档:就是咱们的一条条数据,一条条记录
- 类型
- 设置类型的方式:
- 如果自己的文档没有指定类型,那么ES就会给我们默认配置字段类型
- 设置类型的方式:
- 索引:一个非常大的文档集合。就是DB
- 索引存储了映射类型的字段和其他设置,然后索引被存储在各个分片上
一个集群至少有一个节点,而一个节点就是一个elasricsearch进程
,节点可以有多个索引默认的,如果你创建索引,那么索引将会由5个分片( primary shard ,又称主分片)构成的,每一个主分片会有一一个副本( replica shard ,又称复制分片)
- 倒排索引
- 倒排索引的结构使得ES在不用扫描全部文档的情况下,就能知道哪些文档包含特定的关键字
- elasticsearch使用的是一种称为倒排索引的结构采用Lucene倒排索引作为底层。 这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成,
对于每一个词,都有一个包含它的文档列表
。其实就是,把所有的词条都统计出来,然后列个表,统计一下第一个词文档1有文档1有、第二个词文档1有文档2没有、第三个词文档1没有文档2有…,然后后面咱们搜,比如说由第二个词+第三个词组成的句子时,很明显不用所有文档都找一遍呗
- 关于索引的操作
- 创建一个索引:用PUT命令创建,但是不仅仅可以用kibana发,用Postman这些都能发
PUT /索引名/~类型名~/文档id { "name": "...", "age": ... }
- POST
- 用GET、POST、DELETE等命令进行的增删改查,可以用Kibana中看看结果,就可以看到每个词对应着自己的JSON那一坨,那一坨中有自己的score(相当于权重,就跟咱们在百度中查询词一样,权重高的一般最早被咱们查出来)、version(被修改的次数)…
- 还可以设置正序倒序展示查询结果、分页查询…,其实跟MySQL差不多嘛
- 创建一个索引:用PUT命令创建,但是不仅仅可以用kibana发,用Postman这些都能发
- 高亮查询:
- 文档:就是咱们的一条条数据,一条条记录
- elasticsearch在后台把每个索引划分成多个分片,每片分片可以在集群中的不同服务器间迁移,一个ES个体就是一个集群
4.ELK:拆箱即用的技术,解压完成就能用
- ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被称为Elastic Stack.
Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ )收集的不同格式数据,然后经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)
.- Kibana:【官网: https://www.elastic.co/cn/kibana】【默认端口:5601】
Kibana可以将elasticsearch的数据通过友好的页面展示出来 ,提供实时分析的功能
。市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析.它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。- Kibana是一个针对Elasticsearch的开源分析及可视化平台 ,用来搜索、查看交互存储在Elastidsearch索引中的数据。 使用Kibana ,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard )实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。
5.IK分词器
- 分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,或者说会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如“我爱你”会被分为“我","爱”,“你” ,这显然是不符合要求的.
所以我们需要安装中文分词器ik来解决这个问题
。如果要使用中文,建议使用ik分词器! - IK提供了两个分词算法: ik_smart和ik_max _word ,其中ik_smart为最少切分, ik_max_word为最细粒度划分!
有时候分词算法把我们想要的词给切开了,这样不行。所以咱们得自己给词典中加词,自己编写配置文件。就可以切出咱们自己想要的词了
- elasticsearch-plugin可以通过这个命令来查看加载进来的插件
- 分词操作相关
- term是直接通过倒排索引指定的词条进行精确查询的
- match,会使用分词器解析(先分析文档,然后再通过分析的文档进行查询)
- 去github上下载ik分词器,解压到es中的ik目录中,重启ES
6.ElasticSearch与SpringBoot集成
- 常用网站:
- https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html
- https://www.elastic.co/guide/en/elasticsearch/client/index.html
- 老步骤,
- 跟Springbooot集成一般要导依赖
- 找ES对应的客户端对象
- 在IDEA中建项目,然后用这个客户端类中的方法或者说API操作
- 跟Springbooot集成一般要导依赖
- SpringBoot或者说Java中操作ES的命令
- 索引的操作:
- 创建索引
- 获取索引:判断索引是否存在
- 删除索引
- 创建索引
- 文档的操作:
- 创建文档,添加文档【
原理其实就是,咱们把对象转化为JSON放到ES中,就可以利用ES的特性操作这些数据了
】
- 获取文档
- 获取文档,判断是否存在get /index/doc/1
- 获取文档信息
- 获取文档,判断是否存在get /index/doc/1
- 更新文档信息
- 删除文档
- 大批量插入数据
- 查询
- 设置高亮等特殊玩法
- 设置高亮等特殊玩法
- 创建文档,添加文档【
- 一个例子的部分思路和代码:从数据库中、MQ中获取数据、爬数据
- jsoup,解析网页,导入依赖
- 获取请求返回的页面信息,然后把从数据库/Q等获取到的数据进行解析,解析数据放到ES索引中,获取这些数据实现搜索功能
- 高亮搜索
- jsoup,解析网页,导入依赖
- 索引的操作:
二、ElasticSearch实操
- ElasticSearch实操步骤:
https://www.elastic.co/guide/en/welcome-to-elastic/current/getting-started-general-purpose.html
- 安装,就是解压咱们从官网等地下载回来的ES安装包,然后找里面的执行文件执行,相当于服务器跑起来,客户端这边去访问呗
- https://www.elastic.co/cn/downloads/elasticsearch;
- https://www.elastic.co/guide/en/elastic-stack/current/index.html
- https://www.elastic.co/cn/downloads/elasticsearch;
- ES解压目录:
- 启动(window下双击启动bin目录下的elasticsearch.bat文件),访问9200
- 访问的测试界面
- ES中的head算是一个数据展示工具【ES中建索引跟之前DB中建数据库是一个味】
- 访问的测试界面
巨人的肩膀
ES官方文档
https://www.elastic.co/guide/en/welcome-to-elastic/current/getting-started-general-purpose.html
狂神说Java的课,挺好,推荐看