Loading... # Elasticsearch(一) Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C# )、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。 官网 > http://elastic.co/ ## ES核心概念及原理 ### 什么是搜索? 搜索: 通过一个**关键词**或一段描述,得到你想要的(相关度高)的结果。 ### 为什么不用数据库搜索? - 模糊查询以%开头,不走索引,查询速度慢,性能差 - 不支持分词,搜索结果不准确(相关度很低) ### 倒排索引 传统数据库中,我们通过索引去查找数据,当使用模糊查找时,由于无法匹配索引,导致索引不可用,需要进行全表扫描,数据量大时,效率极低。倒排索引就是对数据进行分词操作,然后根据分词,去索引对应的id,就能根据id找到对应的内容了。倒排索引根据关键词匹配id,索引数据量会大于实际数据量,是一种以空间换时间的手段。' | id | 内容 | | :-: | :-: | | 1 | 小米手机 | | 2 | 小米NFC手机 | | 3 | NFC手机 | | 4 | 小米耳机 | | 5 | 红米耳机 | 如上表格,如果我们要搜索“小米NFC智能手机”,在mysql中,一般会使用 `like '%小米NFC智能手机%'`。首先,由于开头使用了“%”模糊匹配,导致无法使用索引。其次,内容中没有匹配项,所以检索不出结果,实际上,我们期望可以检索到“小米NFC手机”。 倒排索引实现: | 分词 | id | | :-: | :-: | | 小米 | 1,2,4 | | 手机 | 1,2,3 | | NFC | 2,3 | | 耳机 | 4,5 | | 红米 | 5 | 首先,根据上面的表格,对内容进行分词,并匹配存在该分词的id。然后用“小米NFC智能手机”去进行匹配 | id | 内容 | 匹配数 | | :-: | :-: | :-: | | 1 | 小米手机 | 2 | | 2 | 小米NFC手机 | 3 | | 3 | NFC手机 | 2 | | 4 | 小米耳机 | 1 | | 5 | 红米耳机 | 0 | 匹配到关键词的结果都会予以返回,匹配数相当于相关度,可以看到最高的就是“小米NFC手机”,这就是我们想要的答案。“NFC手机”和“小米手机”也是可以接受的结果。 倒排索引的数据结构 1. 包含这个关键词的document list 2. 关键词在每个document中出现的次数TF(term frequency) 3. 关键词在整个索引中出现的次数IDF(inverse document frequency),越高说明相关度越低,每个document都包含,就相当于没有特征,即没有相关性。 4. 关键词在当前document中出现的次数 5. 每个document的长度,越长相关度越低,比如,A与B匹配数都是3,但是A比B长,就认为A的相关度低于B 6. 包含这个关键词的所有document的平均长度 ### Lucene Lucene是apache开源软件基金会的开源全文检索引擎工具包,基于倒排索引实现,使用Lucene可以帮我们自动创建索引,并提供了复杂的API,但是Lucene是单点的,需要我们自己实现集群,维护负载均衡。 如果使用Lucene做集群,会有哪些问题? 1. 没有高可用,节点一旦宕机,该节点数据丢失。 2. 自己创建管理集群索引,比较麻烦,单节点承载能力有限,需要人工做负载。 ### Elasticsearch Elasticsearch相比于Lucene的优点有: **分布式、高性能、高可用、可伸缩、易维护** Elasticsearch是一个分布式的**搜索**,**存储**和**数据分析**引擎。 优点: 1. 面向开发者友好,屏蔽了Lucene的复杂特性,集群自动发现(cluster discovery) 2. 自动维护数据在多个节点上的建立 3. 自动实现搜索请求的负载均衡 4. 自动维护冗余副本,保证了部分节点宕机的情况下,不会有任何数据丢失 5. ES基于Lucene提供了很多高级功能: 复合查询、聚合分析、基于地理位置等 6. 对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别数据。对于小公司,开箱即用,门槛低,上手简单 7. 相比传统数据库,提供了全文检索,同义词处理,相关度排名,聚合分析以及海量数据的近实时(NTR)处理,这些传统数据库完全做不到 应用领域: 1. 搜索引擎,如百度: 全文检索、高亮、搜索推荐 2. 各大网站的用户行为日志: 用户点击、浏览、收藏、评论 3. BI(Business Intelligence 商业智能),数据分析,数据挖掘统计 4. Github: 代码托管平台,几千亿行代码的查询 5. ELK: Elasticsearch(数据存储)、Logstash(日志采集)、Kibana(可视化) #### ES核心概念 1. cluster(集群): 每个集群至少包含两个节点 2. node: 集群中的每个节点,一个节点不代表一台服务器,可以在一台服务器上启动多个节点 3. field: 一个数据字段,与index和type一起,可以定位到具体的document 4. document: ES最小的数据单元,json格式 ``` { "id": "1", "name": "小米", "price": { "标准版": 3999, "尊享版": 4999 } } ``` 5. Type: 逻辑上的数据分类,ES7.x中删除了type的概念 6. Index: 一类相同或者类似的document,比如一个员工索引,商品索引 Shard分片: - Primary Shard: 主分片,每个分片上包含部分数据 - Replica Shard: 副本分片,与对应主分片的数据完全相同,保证宕机时数据不丢失,并且提供搜索请求服务,提高吞吐量 1. 一个Index包含多个Shard,默认是5个Primary Shard,每个Primary Shard分配一个Replica Shard。Primary Shard的数量在创建索引的时候设置,如果想修改,需要重新建立索引。 2. 每个Shard都是一个Lucene实例,有完整的创建索引和处理请求能力。 3. ES会自动在nodes上为我们做shard负载均衡。 4. 一个document是不可能同时存在于多个Primary Shard中的,即每个Primary Shard数据都不同,但是可以存在于多个Replica Shard中。 5. Primary Shard和对应的Replica Shard不能同时存在于同一个节点,所以最低的可用配置是两个节点,互为主备。 分片的好处: 1. 当某一台服务器宕机,可以保证其他数据的完整性(非最优方案) 2. 横向扩容: 当数据量增大时,只需要添加一个新的节点,然后创建新的索引,操作非常简单 3. 看似占用了更多的服务器资源,实际上Replica Shard带来了性能和集群吞吐量的提升,这一点和横向扩容是相同的,不同的是,横向扩容是可以承受更多的数据,而Replica Shard是单纯的增加数据的副本,带来的是高性能和高可用 Last modification:April 17th, 2021 at 06:49 pm © 允许规范转载
?励志类评语?