一、Elasticsearch的介绍
Elasticsearch是一个基于Lucene的搜索服务。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ES官网 https://www.elastic.co/downloads/elasticsearch
中文社区 https://es.xiaoleilu.com/
1、Elasticsearch可以做什么
1)提供快速查询
试想一下,当你打开一个博客网站,搜索一篇博客的时候,等待了一分钟才有搜索结果,那将会是一个极差的体验。可想而知,这个博客网站肯定没有使用搜索引擎处理搜索的请求,而是使用了传统的关系型数据库查询,在庞大的数据面前,关系型数据库的查询就显得力不从心,相当耗时。Elasticsearch在这个时候可以帮上忙,使用博客数据建立索引库,依赖倒排索引的优势,为用户快速的呈现搜索的相关结果。
2)确保结果的相关性
接下来有一个难题: 如何将真正描述选举的帖子排序在前呢?有了 Elasticsearch,就可以使 用几个算法来计算相关性的得分( relevancy score ),然后根据分数来将结果逐个排序 。
默认情况下,计算文档相关性得分的算法是TF-IDF(term frequency-inverse document frequency),词频逆文档频率。我们将在后面讨论这个概念。除了选择算法,Elasticsearch还提供了很多其他内置的功能来计算概相关性得分,以满足定制需求。
3)超越精确匹配,处理错误的拼写
当我们在使用搜索时,会出现英文拼写错误,中文错别字等情况时有发生。我们可以通过配置让Elasticsearch容忍一些错误,而不仅仅只是查找精确匹配。如我们输入“book”的时候由于手误输入了“bok”,如果搜索引擎能够意识到这一错误并且在搜索时帮我们修正这个错误,那么搜索会更快让人满意。
4) 支持变体
这个特性在英文单位搜索时,比较重要,我们搜索一个博客关键词包含“bicycle”的文章,同样可以和“bicylist”或“cycling”的查询匹配上。并且Elasticsearch还有可以将搜索到的关键词加粗上色来凸显。
5)使用统计信息
当用户不太清楚具体要搜索什么的时候,可以通过几种方式来协助他们 。一种方法是聚集统计数据。 聚集是在搜索结果里得到一些统计数据,如每个分类有多少议题、每个分 类中“赞”和“分享”的平均数量。 假想一下,进入博客时,用户会在右侧看见最近流行的议题。 其中之一是自行车。 对其感兴趣的读者会点击这个标题,进一步缩小范围。 然后, 可能还有另外 的聚集方式 ,将自行车相关的帖子分为“ 自行车鉴赏”“自行车大事件”等。
6)给予自动提示
当用户开始输入时,你可以帮助他们发现主流的查询和结果。 还可以通过自动提示技术预测 他们所要输入的内容,就像 Web 上很多搜索引擎做的那样。 你同样可以展示主流的结果,通过 特殊的查询类型来匹配前缀、通配符或正则表达式。
搜索商品、日志分析和挖掘…
2、Elasticsearch的应用场景
(1) 维基百科,类似百度百科,全文检索,高亮,搜索推荐
(2) The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
(3) Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
(4) GitHub(开源代码管理),搜索上千亿行代码
(5) 电商网站,检索商品
(6) 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
(7) BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化
3、Elasticsearch的优缺点
优点:
横向可扩展性:只需要增加一台服务器,做一点配置,启动一下ES进程就可以并入集群;
分片机制提供更好的分布性:同一个索引分成多个分片(sharding),这点类似于HDFS的块机制;分而治之的方式来提升处理效率;
高可用:提供复制(replica)机制,一个分片可以设置多个复制,使得某台服务器宕机的情况下,集群仍旧可以照常运行,并会把由于服务器宕机丢失的复制恢复到其它可用节点上;这点也类似于HDFS的复制机制(HDFS中默认是3份复制);
速度快,负载能力强,在面对海量的数据时,搜索速度极快,并且在同样的硬件资源下,进行大量数据的搜索时,相比一些传统的数据搜索软件ES上手容易,很快可以搭建一个站内搜索引擎;
缺点:
各节点的一致性问题:其默认的机制是通过多播机制,同步元数据信息,但是在比较繁忙的集群中,可能会由于网络的阻塞,或者节点处理能力达到饱和导致各节点元数据不一致——也就是所谓的脑裂问题,这样会使集群处于不一致状态。目前并没有一个彻底的解决方案来解决这个问题,但是可以通过将工作节点与元数据节点分开的部署方案来缓解这种情况。
没有细致的权限管理机制,也就是说,没有像MySQL那样的分各种用户,每个用户又有不同的权限。所以在操作上的限制需要自己开发一个系统来完成;
二、Elasticsearch相关概念
ES在关系型数据库和Elasticsearch中的对应关系
用关系型数据库就会想到建立一张User表,再建字段等,而在Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{
"name" : “Jack",
"sex" : 1
"age" : 25,
"remark" : “hello world"
}
三、Elasticsearch文档映射
1、Mapping概述
Elasticsearch的核心概念和关系数据库对比,
索引(index)相当于数据库,
类型(type)相当于数据表,
映射(Mapping)相当于数据表的表结构。
映射可以分为动态映射和静态映射。
1)动态映射
我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。
而Elasticsearch中不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
2)静态映射
是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射。
3)Elasticsearch文档映射类型
动态映射规则如下:
Elasticsearch文档映射-支持的数据类型:
核心类型(Core datatype):
字符串:string,string类型包含 text 和 keyword。
text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。
keyword:该类型不能分词,可以被用来检索过滤、排序和聚合,keyword类型不可用text进行分词模糊检索。
数值型:long、integer、short、byte、double、float
日期型:date
布尔型:boolean
二进制型:binary
复杂数据类型(Complex datatypes):
地理位置类型(Geo datatypes):
地理坐标类型(Geo-point datatype):geo_point 用于经纬度坐标
地理形状类型(Geo-Shape datatype):geo_shape 用于类似于多边形的复杂形状
特定类型(Specialised datatypes):
IPv4 类型(IPv4 datatype):ip 用于IPv4 地址
Completion 类型(Completion datatype):completion 提供自动补全建议
Token count 类型(Token count datatype):token_count 用于统计做子标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少
mapper-murmur3 类型:通过插件,可以通过_murmur3_来计算index的哈希值
附加类型(Attachment datatype):采用mapper-attachments插件,可支持_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
4)Elasticsearch文档映射
获取映射:
GET /db_index/user/_mapping
具体方法:
1 如果要推倒现有的映射, 你得重新建立一个静态索引
2 然后把之前索引里的数据导入到新的索引里
3 删除原创建的索引
4 为新索引起个别名, 为原索引名
POST _reindex
{
"source": {
"index": "db_index"
},
"dest": {
"index": "db_index1"
}
}
注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机
四、Elasticsearch基于倒排索引的实现
1、什么是索引?
索引是一种单独的、物理的对数据库/集中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
如:详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】右侧目录
页码:
2、Elasticsearch基于倒排索引的实现
五、Elasticsearch 的IK中文分词器插件
详细下载步骤
Elasticsearch 的IK中文分词自定义词语
在plugins/ik/config目录下
Step1: 创建一个custom文件夹
Step2: 创建一个my_word.dic文件, 内容自己添加
如: 流浪地球
Step3: vi编辑config目录下的 IKAnalyzer.cfg.xml
用户可以在这里配置自己的扩展字典
<entry key="ext_dict">custom/my_word.dic</entry>
Step4: 启动 es
通过_analyze指令分词演示
GET _analyze
{
"analyzer": "ik_smart",
"text": "流浪地球"
}