<h3>简单介绍</h3>
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。【百度百科】
</br>
lucene:工具包,里面包含有各种建立索引,以及搜索的代码
</br>
全文检索
传统的关系型数据库中检索特定的关键词,一般采用的是顺序扫描,这种顺序扫描需要扫描整张表的每条记录,并且还需要对每条记录做模糊匹配以判断是后含有关键词。相对于倒排索引通过关键词确定文档的位置来说,速度慢,性能差
</br>
分布式:多节点,数据分片,数据副本,容错性,高并发
<li> elasticsearch对复杂的分布式机制的透明隐藏特性
es隐藏了分布式的特性,使用者不用关心其中的细节即可使用es的功能,如:写入数据时自动分片,搜索请求自动分发,扩容时数据分片自动分配
<li>reblance
分布式架构一般都具有负载均衡的特性,es也不例外,一方面表现在在扩容时es会自动重新分配数据,另一方面就是请求会自动分配到不同节点上(shard分片)达到请求的负载均衡
<li>集群节点的作用
master节点:只负责创建或者是节点和索引,也就是维护集群的元数据,master是高可用的,通过选举机制在启动或者是master挂掉之后选出新的master节点,可配置那些节点可以成为master节点
slaver节点:每个slaver节点都是平等的,任何的slaver节点都可以接受请求,并将请求分发给不同节点,以及收集各个节点的response并返回给客户端
</br>
</br>
<h3>基本概念</h3>
<li>Index:这是es存储数据的地方,类似于关系数据库
<li>type:类似关系数据库的表,主要功能是将完全不同schema的数据分开,一个index里面可以有若干个type。
<li>document:这个类似关系数据库的一行,在同一个type下面,每一document都有一个唯一的id作为区分;
<li>field:document Json中的一个字段,类似关系数据库的某一列,这是es数据存储的最小单位
<li>Near Realtime(NRT):近实时,从数据写入到数据可以被搜索到有一个小延迟,基于es执行的搜索和分析可以达到秒级
<li>Cluster和Node:es可以以单点或者集群方式运行,以一个整体对外提供search服务的所有节点组成cluster,组成这个cluster的各个节点叫做node。
<li>shard:通常叫分片,这是ES提供分布式搜索的基础,其含义为将一个完整的index分成若干部分存储在相同或不同的节点上,这些组成index的部分就叫做shard。
<li>replica:和replication通常指的都是一回事,即index的冗余备份,可以用于防止数据丢失以及负载均衡
</br>
</br>
<h3>es的基本CURD(kibana)</h3>
新增
put /tech/phone/1 {"name":"荣耀v9","price":3499,"desc":"你想要的快","tag":["秒拍","秒杀","秒抢"]}
put /tech/phone/2 {"name":"荣耀magic","price":3699,"desc":"magic live","tag":["智能 ","ai"]}
查询
get /tech/phone/1
get /tech/phone/2
查询集群中的index状态
get _cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana qsZ5uf5RSsK3g68j6zX3Fw 1 1 1 0 3.1kb 3.1kb
yellow open tech SpvwgpUxT7yY_iHaRqWSng 5 1 2 0 10.3kb 10.3kb
更新
put /tech/phone/1/_update {"doc":{"name":"honor v9"}}
删除
delete /tech/phone/1
</br>
</br>
<h3>多种搜索方式</h3>
<li>query string search
搜索全部商品:get /tech/phone/_search
搜索商品名称中包含荣耀的商品,并且按照价格降序排序:get /tech/phone/_search?q=name:荣耀&sort=price:desc
query string search使用的是get请求,对于复杂的请求,queryString比较难于构建,所以这种方式一般的不是经常使用的,一般采用DSL
<li>query DSL(domain specified language)
搜索全部商品:post /tech/phone/_search{"query":{"match_all":{}},"from":0,"size":1}
搜索商品名称中包含荣耀的商品,并且按照价格降序排序:post /tech/phone/_search/{"query":{ "match":{ "name":"v9"}},"sort":[{"price":"asc"}]}
<li>全文检索
post /tech/phone/_search{"query":{"match":{"name":"v9 magic"}}}
<li>phrase search(短语搜索),同时包含
post /tech/phone/_search{"query":{"match_phrase":{"name":"v9 magic"}}}
DSL比较灵活,采用的是post请求,请求参数使用统一json格式,除了基本的匹配搜索、全文检索、短语搜索外,还包含诸如:过滤,高亮,聚合等类似于关系型数据库的操作。
网友评论