|
| 1 | +Elasticsearch,分布式,高性能,高可用,可伸缩的搜索、分析系统。 |
| 2 | +# ES基本概念 |
| 3 | + |
| 4 | +## 1 概述 |
| 5 | + |
| 6 | +### 按主题 |
| 7 | + |
| 8 | +- 书目数据库 (Bibliographic database) |
| 9 | +- 企业搜索 (Enterprise search) |
| 10 | +- 医学文献检索 (Medical literature retrieval) |
| 11 | +- 垂直搜索(Vertical search) |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +## 2 垂直搜索(站内搜索) |
| 16 | + |
| 17 | + |
| 18 | + |
| 19 | +- 互联网搜索:电商网站,招聘网站,新闻网站,各种app |
| 20 | +- IT系统搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“牙膏”,订单,“牙膏相关的订单” |
| 21 | + |
| 22 | +搜索,输入一段要搜索的关键字,期望找到这关键字相关信息。 |
| 23 | + |
| 24 | +## 3 数据库搜索 |
| 25 | + |
| 26 | +数据都存储在数据库里。技术角度,如何实现搜索,电商网站内部的搜索功能的话,就可以考虑,去使用数据库进行搜索。 |
| 27 | + |
| 28 | +### 3.1 案例-电商系统搜索 |
| 29 | + |
| 30 | +- 搜索含牙膏的商品 |
| 31 | +- 在数据库中商品名称字段中存储有关键字 |
| 32 | + |
| 33 | +不考虑数据库的全文索引,假如商品有 1000 万个,得查找 1000 万次,且每次都需要加载商品的名称字段的整段字符串,并挨个寻找: |
| 34 | + |
| 35 | + |
| 36 | +- 每条记录的指定字段的文本,可能很长 |
| 37 | + 如“商品描述”字段的长度,有长达数千个,甚至数万字符。每次都对每条记录的所有文本进行扫描,难以判断,你包不包含我指定的这个关键词(如“牙膏”) |
| 38 | +- 无法将搜索词拆分 |
| 39 | + 尽可能去搜索更多的符合你的期望的结果,如输入“生化机”,就搜索不出来“生化危机”了 |
| 40 | + |
| 41 | +用DB实现搜索,不靠谱,性能很差。 |
| 42 | + |
| 43 | +## 4 全文检索 & Lucene |
| 44 | + |
| 45 | +### 4.1 全文检索 |
| 46 | + |
| 47 | +#### 4.1.1 场景:搜索“生化机” |
| 48 | + |
| 49 | +全文检索: |
| 50 | + |
| 51 | + |
| 52 | +但期望出来右侧的4条记录。将每条数据进行词条拆分。如“生化危机电影”拆成:生化、危机、电影等关键词(拆分结果取决于具体的策略算法)。 |
| 53 | +每个关键词将对应包含此关键词的数据ID。搜索时,直接匹配这些关键词,就能拿到包含关键词的数据。该过程即全文检索。 |
| 54 | + |
| 55 | +词条拆分和词条对应的ID就是倒排索引的的基本原理。 |
| 56 | + |
| 57 | +#### 4.1.2 V.S DB |
| 58 | + |
| 59 | +DB的数据共100万条,按之前思路,就要扫描100万次,且每次扫描,都需匹配那个文本所有的字符,确认是否包含搜索的关键词,而且还不能将搜索词拆解开来进行检索。 |
| 60 | + |
| 61 | +#### 4.1.3 利用倒排索引 |
| 62 | + |
| 63 | +假设100万条数据,拆分出来的词语,假设有1000万个,则倒排索引中,就有1000万行,可能并不需要搜索1000万次。很可能搜索第一次时,就能找到该搜索词对应的数据。也可能是第100次或第1000次。 |
| 64 | + |
| 65 | +### 4.2 lucene |
| 66 | + |
| 67 | +一个jar包,包含封装好的各种建立倒排索引及进行搜索的算法。用lucene,就能将已有数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。 |
| 68 | + |
| 69 | +## 1 基本概念 |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +### segment file(Lucene) |
| 74 | + |
| 75 | +存储倒排索引的文件,每个segment本质上就是个倒排索引,每s都会生成一个segment文件。 |
| 76 | + |
| 77 | +当文件过多时,ES会自动segment merge(合并文件),合并时会同时将已标注删除的文档物理删除。 |
| 78 | + |
| 79 | +### commit point |
| 80 | + |
| 81 | +记录当前所有可用的segment,每个commit point都会维护一个.del文件(ES删除数据本质不属于物理删除)。 |
| 82 | + |
| 83 | +当ES删改操作时,先在.del文件声明某个document已被删除,文件内记录了在某个segment内某个文档已被删除。 |
| 84 | + |
| 85 | +当查询请求过来时,在segment中被删除的文件是能够查出来的,但当返回结果时会根据commit point维护的那个.del文件,将已删除的文档过滤。 |
| 86 | + |
| 87 | +### translog日志文件 |
| 88 | + |
| 89 | +为防止ES宕机造成数据丢失保证可靠存储,ES会将每次写入数据同时写到translog日志。 |
| 90 | + |
| 91 | +## 5 Elasticsearch的适用场景 |
| 92 | + |
| 93 | +- 维基百科,类似百度百科 |
| 94 | +- The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜) |
| 95 | +- Stack Overflow |
| 96 | +- GitHub(开源代码管理),搜索上千亿行代码 |
| 97 | +- 电商网站,检索商品 |
| 98 | +- 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana) |
| 99 | +- 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买 |
| 100 | +- BI系统,商业智能,Business Intelligence。如大型商场集团,BI分析某区域最近3年用户消费金额趋势及用户群体组成构成,产出相关的数张报表,xx区最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化 |
| 101 | +- 国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景) |
| 102 | + |
| 103 | +## 6 特点 |
| 104 | + |
| 105 | +(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司 |
| 106 | +(2)不是新技术,主要将全文检索、数据分析以及分布式技术合并,才形成独一无二ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat) |
| 107 | +(3)对用户开箱即用,简单,作为中小型应用,直接3min部署ES,就可作为生产环境系统来使用,数据量不大,操作不太复杂 |
| 108 | +(4)数据库的功能面对很多领域不够用;特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个补充 |
| 109 | + |
| 110 | +## 7 功能 |
| 111 | + |
| 112 | +### 7.1 分布式的搜索引擎和数据分析引擎 |
| 113 | + |
| 114 | +搜索:百度,网站的站内搜索,IT系统的检索 |
| 115 | +数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些;新闻网站,最近1个月访问量排名前3的新闻版块是哪些 |
| 116 | +分布式,搜索,数据分析 |
| 117 | + |
| 118 | +### 7.2 全文检索,结构化检索,数据分析 |
| 119 | + |
| 120 | +全文检索:我想搜索商品名称包含牙膏的商品 |
| 121 | + |
| 122 | +```sql |
| 123 | +select * from products where product_name like "%牙膏%" |
| 124 | +``` |
| 125 | + |
| 126 | +结构化检索:搜索商品分类为日化用品的商品 |
| 127 | + |
| 128 | +```sql |
| 129 | +select * from products where category_id='日化用品' |
| 130 | +``` |
| 131 | + |
| 132 | +部分匹配、自动完成、搜索纠错、搜索推荐 |
| 133 | +数据分析:分析每个商品分类下有多少个商品 |
| 134 | + |
| 135 | +```sql |
| 136 | +select category_id,count(*) from products group by category_id |
| 137 | +``` |
| 138 | + |
| 139 | +### 7.3 对海量数据进行近实时处理 |
| 140 | + |
| 141 | +- 分布式:ES可自动将海量数据分散到多台服务器,去存储和检索。 |
| 142 | +- 海量数据处理:分布式后,就可采用大量服务器去存储和检索数据,实现海量数据的处理 |
| 143 | +- 近实时:检索个数据要花费1h(这就不要近实时,离线批处理,batch-processing)。在秒级别对数据进行搜索和分析 |
| 144 | + |
| 145 | +跟分布式/海量数据相反的:lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量。 |
| 146 | + |
| 147 | +## 8 意义 |
| 148 | + |
| 149 | + |
| 150 | + |
| 151 | + |
| 152 | +使用 lucene 开发搜索服务,部署在一台机器上面,但是无法解决当数据量增大的时候出现的问题(图上右侧)。对此,ES就是利器: |
| 153 | + |
| 154 | +- 自动维护数据的分布到多个节点的索引建立、检索请求分布到多个节点的执行 |
| 155 | +- 自动维护数据的冗余副本,保证一些机器宕机了,不会丢失任何数据 |
| 156 | +- 更多高级功能 |
| 157 | +- 复杂搜索功能,聚合分析的功能,基于地理位置的搜索(距离我当前位置 1公里 以内的烤肉店) |
0 commit comments