一、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": "流浪地球"
}

ElasticSearch学习,请先看这一篇(win_Elasticsearch)相关推荐

  1. 学习Nginx,看完这篇超详细的文章就够了

    目录 本文简介 一.Nginx的基本概念 1.1.Nginx是什么? 1.2.Nginx能帮助我们做些什么? 1.3.Nginx的特性 二.Nginx的安装 2.1.环境介绍 2.2.安装Nginx ...

  2. Elasticsearch学习,请先看这一篇!

    #题记: Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识.原理从初学者认知.学习的角度,从以下9个方面进行详细梳理.欢迎讨论...... #0. 带着问题上路 ...

  3. ElasticSearch中文分词,看这一篇就够了

    写在前面:我是「且听风吟」,目前是某上市游戏公司的大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面. ...

  4. 0基础学python-零基础如何开始学习 Python?看完这篇从小白变大牛!

    1.选择Python版本 对于Python工程师来说,Python的版本则是你们的工作环境.所以在学习之前一定要考虑选择一个合适自己的版本,Python3对零基础的小白很友好,易上手.选好版本后就可以 ...

  5. Elasticsearch 的使用,看这一篇就够了!

    前两天看到曹政大佬的文章,说他上个世纪末在广州做 PHP 程序员的时候,接到一个私活儿. 有个客户是开律所的,要做个法律查询的网站.他整了个 Mysql,把内容导进去,写个搜索查询语句就搞定了.客户觉 ...

  6. 零基础学python-零基础如何开始学习 Python?看完这篇从小白变大牛!

    1.选择Python版本 对于Python工程师来说,Python的版本则是你们的工作环境.所以在学习之前一定要考虑选择一个合适自己的版本,Python3对零基础的小白很友好,易上手.选好版本后就可以 ...

  7. 区块链学习路径,看这一篇就够了 | FISCO BCOS

    FISCO BCOS开源社区已沉淀过百篇文章,覆盖了区块链学习各个阶段.为了方便大家对应自身学习阶段找到合适的教程,我们按照区块链学习成长路径对社区文章进行整理排序,希望沿着这份路径规划,大家都能成为 ...

  8. 深度学习与计算机视觉 看这一篇就够了

    来源:http://www.leiphone.com/news/201605/zZqsZiVpcBBPqcGG.html#rd 人工智能是人类一个非常美好的梦想,跟星际漫游和长生不老一样.我们想制造出 ...

  9. 【C++学习笔记】看完这篇,C++ 的链接问题不怕你搞不明白!

    C++的链接分为两部分,一个是编译时,一个是运行时.但运行时的行为也收到编译参数的影响. 1. 编译时链接 基本就两个参数, -l和-L: -l编译时要链接的库(包括动态链接库.so和静态链接库.a) ...

最新文章

  1. oracle查询保留2位小数
  2. mysql数据库入门教程(7):库和表的管理
  3. Redis有序集合详解
  4. 高并发红包整体设计方案
  5. 特殊Office Communicator 2007 R2 Outlook集成错误
  6. 夜神模拟器+Xposed框架+JustTrustMe(用来禁用、绕过 SSL 证书检查)来突破SSL Pinning
  7. TortoiseSVN安装和使用
  8. 华为交换机sftp 配置
  9. Meebo 和 GMail + Talk 等 WebIM 的实现方式
  10. uni-app 微信小程序分享按钮
  11. 苹果电脑如何同时运行Mac和Windows--pd18
  12. python实现词云(爬取豆瓣影评)
  13. http 307重定向
  14. 稳住不慌:运维职业成长路线规划
  15. Linux之阻塞与非阻塞IO
  16. 怎样用PS修改图片上的数字
  17. 计算机主机并联,如何一台主机多台电脑使用
  18. Lucene之——搜索实例
  19. mc经常闪退是java有问题_【疑问】求大神回答,mc闪退,提供崩溃报告
  20. 概率论【蜂考】期末速成(一)

热门文章

  1. CodeForces - 1438E Yurii Can Do Everything(暴力)
  2. SPOJ - OPTM Optimal Marks(进制拆分+最小割)
  3. 牛客多校 - Minimum-cost Flow(最小费用最大流+贪心)
  4. 牛客 - Prize(bitset优化暴力)
  5. URAL - 1297 Palindrome(后缀数组+RMQ)
  6. EOJ_1020_铁路调度
  7. delphi调用windows api
  8. 经典永不过时!重温设计模式
  9. 面试官:InnoDB中一棵B+树可以存放多少行数据?
  10. Spring Boot 核心知识,深入剖析!