ES(Elasticsearch)全⽂搜索引擎(最全)⼊门基本语法与在SpringBoot中的
实战
注:本⽂较长,根据个⼈情况有些内容可以跳过,前⾯是基本的概述,中间是⼀些基于es的⼀个可视化⼯具进⾏操作,代码实现在最下边;
⼀、认识Elasticsearch
1.1、为什么要使⽤Elasticsearch
虽然在全⽂搜索领域中,Lucene可以被认为是迄今为⽌最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是⼀个库。想要使⽤它,你必须使⽤Java来作为开发语⾔并将其直接集成到你的应⽤中,更糟糕的是,Lucene的配置及使⽤⾮常复杂,你需要深⼊了解检索的相关知识来理解它是如何⼯作的。
实际项⽬中,我们建⽴⼀个⽹站或应⽤程序,并要添加搜索功能,令我们受打击的是:搜索⼯作是很难的。我们希望我们的搜索解决⽅案要快,我们希望有⼀个零配置和⼀个完全免费的搜索模式,我们希望能够简单地使⽤JSON/XML通过HTTP的索引数据,我们希望我们的搜索服务器始终可⽤,我们希望能够
从⼀台开始并在需要扩容时⽅便地扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建⽴⼀个云的解决⽅案。
1.2、ElasticSearch(简称ES)
ES即为了解决原⽣Lucene使⽤的不⾜,优化Lucene的调⽤⽅式,并实现了⾼可⽤的分布式集的搜索⽅案,其第⼀个版本于2010年2⽉出现在GitHub上并迅速成为最受欢迎的项⽬之⼀。
⾸先,ES的索引库管理⽀持依然是基于Apache Lucene™的开源搜索引擎。
ES也使⽤Java开发并使⽤Lucene作为其核⼼来实现所有索引和搜索的功能,但是它的⽬的是通过简单的 RESTful API来隐藏Lucene的复杂性,从⽽让全⽂搜索变得简单。
不过,ES的核⼼不仅仅在于Lucene,其特点更多的体现为:
分布式的实时⽂件存储,每个字段都被索引并可被搜索
分布式的实时分析搜索引擎 --ES
可以扩展到上百台服务器,处理PB级结构化或⾮结构化数据
KB-MB-GB-TB-PB
⾼度集成化的服务,你的应⽤可以通过简单的 RESTful API、各种语⾔的客户端甚⾄命令⾏与之交互。
上⼿Elasticsearch⾮常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它拥有开瓶即饮的效果(安装即可使⽤),只需很少的学习既可在⽣产环境中使⽤。
总结:ElasticSearch简化了全⽂检索lucene的使⽤,同时增加了分布式的特性,使得构建⼤规模分布式全⽂检索变得⾮常容易。
⼆、ES的核⼼概念
2.1、⼏个基本概念
Near Realtime(NRT)
近实时,两个意思,从写⼊数据到数据可以被搜索到有⼀个⼩延迟(⼤概1秒);基于es执⾏搜索和分析可以达到秒级;
Index:索引库
包含⼀堆有相似结构的⽂档数据,⽐如可以有⼀个客户索引,商品分类索引,订单索引,索引有⼀个名称。⼀个index包含很多document,⼀个index就代表了⼀类类似的或者相同的document。⽐如说建⽴⼀个product index,商品索引,⾥⾯可能就存放了所有的商品数据,所有的商品document;
Type:类型
每个索引⾥都可以有⼀个或多个type,type是index中的⼀个逻辑数据分类,⼀个type下的document,都有相同的field,⽐如博客系统,有⼀个索引,可以定义⽤户数据type,博客数据type,评论数据type;
Document&field:⽂档字段
⽂档,es中的最⼩数据单元,⼀个document可以是⼀条客户数据,⼀条商品分类数据,⼀条订单数据,通常⽤JSON数据结构表⽰,每个index下的type中,都可以去存储多个document。⼀个document⾥⾯有多个field,每个field就是⼀个数据字段;可以拿Mysql去对⽐⽅便理解⼀点;
2.2、集相关概念
Cluster:集
包含多个节点,每个节点属于哪个集是通过⼀个配置(集名称,默认是elasticsearch)来决定的,对于中⼩型应⽤来说,刚开始⼀个集就⼀个节点很正常;
Node:节点
集中的⼀个节点,节点也有⼀个名称(默认是随机分配的),节点名称很重要(在执⾏运维管理操作的时候),默认节点会去加⼊⼀个名称为"elasticsearch"的集,如果直接启动⼀堆节点,那么它们会⾃动组成⼀个elasticsearch集,当然⼀个节点也可以组成⼀个elasticsearch集;
shard:分⽚
单台机器⽆法存储⼤量数据,es可以将⼀个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执⾏,提升吞吐量和性能。每个shard都是⼀个lucene index;
replica:复制品
任何⼀个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备⽤服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建⽴索引时⼀次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最⼩的⾼可⽤配置,是2台服务器;
集的健康状况
green
所有的 primary shard 和 replica shard 都是 active 活动状态 - 集健康
yellow
所有的 primary shard 处于 active 活动状态,有部分的 replica shard 不处于 active 状态 - 集能⽤
red
⾄少有⼀个 primary shard 不处于 active 活动状态就会出现red - 集不健康
三、ES安装及使⽤说明
3.1、包含的内容
ES的安装⽐较简单,只需要官⽅下载ES的运⾏包,然后启动ES服务即可。
ES的使⽤主要是通过能够发起HTTP请求的终端来接⼊,⽐如Poster插件、CURL、kibana5等。
3.2、安装ES
3.3、辅助管理⼯具Kibana5
② 解压并编辑l,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
下⾯是它每个⽬录是⼲啥⽤的:
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:⾃定义主⾯板(添加图表)
Timelion:Timelion是⼀个kibana时间序列展⽰组件(暂时不⽤)
Dev Tools :Console(同CURL/POSTER,操作ES代码⼯具,代码提⽰,很⽅便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。
⑤正常情况,我们都是在Dev Tools中去操作;
四、ES集成ik分词器
4.1、什么是分词
在全⽂检索理论中,⽂档的查询是通过关键字查询⽂档索引来进⾏匹配,因此将⽂本拆分为有意义的单
词,对于搜索结果的准确性⾄关重要,因此,在建⽴索引的过程中和分析搜索语句的过程中都需要对⽂
本串分词。ES的倒排索引是分词的结果。
4.2、ES倒排索引原理
4.3、安装概述
为了后⾯做类型映射,需要先集成分词器;
lucene由于是jar⼯具包,如果要在使⽤lucene的环境下使⽤ik分词器,只需导⼊对应jar,做⼀些配置就OK.但是ES不是⼯具包了,是服务器.怎么集成呢?
以插件的⽅式集成ES服务器,客户端只需告诉我们某个字段要⽤这个分词器就OK了.
步骤:
服务端安装ik插件
客户端端指定字段⽤ik分词器
4.4、安装
②maven打包
mvn install -st.skip=true
③安装到es服务器
解压到es/plugins
④配置
可选
⑤重启
4.5、测试分词器
随便在⽹上段话,看看效果如何
POST _analyze
{
"analyzer":"ik_smart",
"text":"总有⼀些⽂章⼀些句⼦让我们感同⾝受,引发读者们的共鸣"
springboot结构}
当然后⾯还有很多,截了⼀部分;
注意:IK分词器有两种类型,分别是ik_smart分词器和ik_max_word分词器。
ik_smart: 会做最粗粒度的拆分,⽐如会将“中华⼈民共和国国歌”拆分为“中华⼈民共和国,国歌”。
ik_max_word: 会将⽂本做最细粒度的拆分,⽐如会将“中华⼈民共和国国歌”拆分为“中华⼈民共和国,中华⼈民,中华,华⼈,⼈民共和国,⼈民,⼈,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
五、操作命令
现在该安装的都安装了,该弄的都弄完了,现在来实际操作⼀波
5.1、索引库CRUD
都是在Kibana中进⾏操作的
5.1.1、增加索引库
创建⼀个名字为 shopping 的索引库,5个 Master Shard 分⽚,每个Master Shard分⽚有1个 Replica Shard 从分⽚
PUT shopping
{
"settings":{
"number_of_shards":5,
"number_of_replicas":1
}
}
5.1.2、查询索引库
查询所有索引库
GET _cat/indices?v
查看指定索引库
GET _cat/indices/{index}
5.1.3、删除索引库
DELETE {index}
5.1.4、修改索引库
没有直接修改的⽅法哦,只能先删除再去增加
5.2、⽂档CRUD
5.2.1、⽂档的概念
ES是⾯向⽂档(document oriented)的,这意味着它可以存储整个对象或⽂档(document);
然⽽它不仅仅是存储,还会索引(index)每个⽂档的内容使之可以被搜索。在ES中,你可以对⽂档(⽽⾮成⾏成列的数据)进⾏索引、搜索、排序、过滤。
ES使⽤Javascript对象符号(JavaScript Object Notation),也就是JSON,作为⽂档序列化格式。JSON现在已经被⼤多语⾔所⽀持,⽽且已经成为NoSQL领域的标准格式。
尽管原始的 Java对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在ES中将对
象转化为JSON并做索引要⽐在表结构中做相同的事情简单的多。
⼀个⽂档不只有数据。它还包含元数据(metadata)—关于⽂档的信息。
三个必须的元数据节点是:
_index:索引库,类似于关系型数据库⾥的“数据库”——它是我们存储和索引关联数据的地⽅。
_type:在应⽤中,我们使⽤对象表⽰⼀些“事物”,例如⼀个⽤户、⼀篇博客、⼀个评论,或者⼀封邮件。可以是⼤写或⼩写,不能包含下划线或逗号。我们将使⽤ employee 做为类型名。
_id: 与 _index 和 _type 组合时,就可以在ELasticsearch中唯⼀标识⼀个⽂档。当创建⼀个⽂档,你 可以⾃定义 _id ,也可以让Elasticsearch帮你⾃动⽣成。另外还包括:uid⽂档唯⼀标识(type#id)
_source:⽂档原始数据
_all:所有字段的连接字符串
5.2.2、添加⽂档

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。