赞
踩
ES在搜索和数据分析中的应用越来越广泛,在之前项目中对ES的使用有些心得,最近有不少朋友和同事都问到了ES,刚好最近也有些时间,所以打算通过8~10篇文章介绍下ES.(其实我也不知道最终会写下多少篇)
本篇文章计划给大家介绍什么ES,ES的架构,以及ES搜索入门.我尽量用简单不拖沓的语言给大家介绍,水平有限,时间也有限,各位读者如发现文中有不当之处,请留言指正.
ES的全称是Elasticsearch,翻译过来就是弹性搜索,知道就可以,不用纠结这个词的含义,我觉得这个词并不能表述ES的含义.
ES并不是传统意义上的数据库,所以不需要用传到的数据库例如Oracle,mysql等数据库与ES进行类比.ES是建立在Lucene(全文搜索)基础上的分布式准实时搜索引擎.
ES与Mysql,Redis,MongoDB存在本质上的差别,它不是用来存储数据的地方,更多的是一个搜索引擎,可以快速的搜索我们需要的内容,并且对搜索的内容按照相关性的权重进行评分,从而实现相关度更高的内容优先级越高.
先来了解ES里面包含的基本概念
和传统的索引概念类似,都是为了提高搜索效率的,这里需要了解的是ES的索引与Lucene(全文搜索)的索引因为分布式设计的原因,他们之间是一对多的关系.
ES中的文档就是数据记录,里面包含了字段,并且定义了字段的数据类型,ES提供了对文档的增删改查功能.比较特别的是这里引入了一个版本的概念,每次写操作版本号都会加1,在读取操作时,ES会返回最新版本的文档.
一个文档可以包含多个字段,每个字段对应有数据类型,除了传统的数据类型之外,ES还提供了其特有的数据类型,例如:IP地址,数组类型,经纬度类型. 这些类型在实际使用中也是经常用到.例如我们需要搜索家附近的美食.
建立索引时需要定义文档的数据结构,这种结构就是映射.在定义数据结构时一般需要指定数据类型,这里需要考虑清楚,因为数据类型一旦指定就不能做更改.
ES还提供了一种自动映射功能: 在定义映射时字段没有指定数据类型,那么在添加该字段时,ES会根据提供的数据类型进行推断,从而自动进行字段类型的定义,同样的,一旦这个字段类型被推断出来了,就相当于已经定义了,后期也不能进行更改.
在分布式系统中,多台服务器一起协作被称为集群,而每个服务器被称为节点.
在ES中会对数据进行切割,并存储在分布式部署的多个服务器中,在切割时是将每一个Lucene索引作为一个分片,每个索引默认为设置5个分片,分片的个数一旦设定不允许更改.
也可以为分片创建副本,创建之后的副本叫做副分片,副分片的数量没有限制.
DSL是ES的查询语言,采用JSON进行表达,这个跨平台跨语言进行通信.
1) 索引方式与传统数据库不同,ES采用的倒排索引(反向索引)
2) 在执行操作时ES假设冲突不会发生,采用乐观锁,不支持事务;
3) 由于ES采用的是分片的方式,一开始就考虑到了数据的膨胀,有利于后期的扩展;
4) ES在写入数据的时候是先写入缓存,大概1s之后写入磁盘,所以ES的数据大概有1s的延迟,被称为准实时.
前面提到过节点就是服务器,按照职责可以分为master节点,数据节点,协调节点.
master节点负责整个集群的维护工作.
数据节点负责索引数据的存储,当客户端向某个节点发出请求的时候,那么这个节点被称为协调节点,请求结束,协调节点的生命周期结束.
ES为了支持分布式部署,将数据进行分割,一个索引对应一个或者多个分片,并且实现了路由,由路由分配读取哪个分片.当某个分片出现问题的时候,集群会将该分片剔除,路由就不会给该分片分配查询.
当ES的协调节点收到文档写入请求时, 会利用路由分派到具体的主分片上,然后再到分片上的节点,该节点的数据存储完成之后,节点在将数据同步到其他的副分片所在的节点,最终完成文档的写入工作.
协调定收到客服端某个索引文档读取请求时,协调点会找到该文档所在的所有分片,并使用轮询算法(不用纠结),选择一个合适的分片,并将请求转给这个分片下的节点,数据找到后返回给协调点,再有协调点将数据返回给客户端.
下载路径:ES 下载路径
本案例使用的版本是7.17.12
解压缩到一个文件夹,运行bin/elasticsearch.bat 就可以启动.
然后在地址栏输入 http://localhost:9200/
就可以看到如下内容:
能成功运行,那么第一步已经跨出去了.
kibana是开源,免费的可视化数据搜索和分析平台,本章中我们需要用到这个工具.下载地址是:
下载的Kibana版本需要和ES的版本保持一致,本案例下载的是kibana-7.17.12.
运行bin/kibana.bat,然后在浏览器中访问:http://localhost:5601/app/home#/
点击上面的搜索框,选择Dev Tools 可以看到如下内容:
然后可以转到控制台
在左侧区域输入以下内容测试创建索引:
- PUT /fresh_mall //请求类型为put,fresh_mall是索引的名称
- {
- "mappings": {
- "properties": { //指定索引映射的字段和数据类型
- "title":{
- "type": "keyword" //title字段的数据类型为keyword
- },
- "detailContent":{
- "type":"text"
- },
- "price":{
- "type": "double"
- }
- }
- }
- }
在索引中添加一条测试数据,同样在控制台输入:
- POST /fresh_mall/_doc/001
- {
- "title":"红富士苹果",
- "detailContent":"源生鲜正宗山东烟台红富士苹果官方旗舰店5斤孕妇新鲜水果含有维C",
- "price":39.9
- }
我们可以看到如下结果:
GET /fresh_mall/_doc/001
- GET /fresh_mall/_search
- {
- "query": {
- "match": {
- "detailContent":"红富士"
- }
- }
- }
query表示搜索,match表示模糊匹配,但是这里需要detailContent字段不能是keyword,如果是keyword只能做完全匹配.
执行的结果如下:
- {
- "took" : 3,
- "timed_out" : false,
- "_shards" : {
- "total" : 1,
- "successful" : 1,
- "skipped" : 0,
- "failed" : 0
- },
- "hits" : {
- "total" : {
- "value" : 1,
- "relation" : "eq"
- },
- "max_score" : 0.8630463,
- "hits" : [
- {
- "_index" : "fresh_mall",
- "_type" : "_doc",
- "_id" : "001",
- "_score" : 0.8630463,
- "_source" : {
- "title" : "红富士苹果",
- "detailContent" : "源生鲜正宗山东烟台红富士苹果官方旗舰店5斤孕妇新鲜水果含有维C",
- "price" : 39.9
- }
- }
- ]
- }
- }
这里可以看到_score字段,是给这个查询结果的权重进行了评分,评分越高的证明与搜索词关联越紧密.
好了,今天暂且到这里了.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。