ES第一天-大纲与基本概念

什么是搜索?

百度、垂直搜索(站内搜索)
搜索:通过一个关键词或一段描述,得到你想要的(相关度高)结果。

如何实现搜索功能?

在这里插入图片描述

用传统关系型数据库的模糊匹配?

1、效率问题,如果使用数据库的模糊匹配,将会导致索引失效,也就是一次扫描将会是O(n)的时间复杂度,会造成一次全表扫描,当数据量大的时候,这个速度慢的是无法想象的。
2、语义问题(结果不准确,相关度低),就像你在百度上搜索 “小米NFC智能手机”,实际上你更想将记录为“小米NFC手机”也能够检索出来,这是数据库模糊匹配无法实现的。

ES是怎么做的?

es底层使用了分词技术,将一段内容通过分词后,将这些分词分别作为索引进行存储,这在es中称为倒排索引。
而还存在一个语义匹配的问题,就是如果存在多条记录可以匹上,那哪些才是用户想要的? 这涉及到一个匹配度的概念,es会去分别看每一条记录被命中倒排索引的个数,进而去统计匹配度。

倒排索引、Lucene和全文检索

倒排索引的数据结构

1、包含这个关键词的那些doc列表
2、关键词在每个doc中出现的次数 TF Term Frequency
3、关键词在整个索引中出现的次数 IDF inverse doc frequency
4、关键词在当前doc中出现的次数
5、每个doc的长度,越长的相关度越低
6、包含这个关键词的所有doc的平均长度

Lucene

lucene是啥?它就是一个jar包,帮我们创建倒排索引,提供了复杂的API。
既然是一个jar包,也就是一个java应用,势必存在单点的瓶颈问题,包括但不限于单点故障,承载能力有限。
在这里插入图片描述
为了高可用,一般就会考虑做横向集群实现搜索,但会存在问题:
1、节点一旦宕机,数据丢失,后果不堪设想,可用性差
2、自己维护,比较麻烦(自己创建管理索引),依旧存在单点承载能力有限,需要人工做负载。

ES(ElasticSearch)

介绍

由上可知,lucene可以做集群,但非常麻烦,整个过程都需要自己来完成,基于这个背景,es就像救星一般出现。
它对开发者非常友好,屏蔽封装了复杂的细节。
es是分布式、高性能、高可用、可伸缩、易维护的。
es可以做搜索引擎,但es≠搜索引擎,搜索引擎比较庞大,不仅由es就能完成,只能说es是实现搜索引擎的某一部分。
准确来说,es是分布式的搜索,存储和数据分析引擎。
在这里插入图片描述

优点

1、面向开发者,屏蔽复杂特性,集群自动发现机制(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(可视化)

基本概念

cluster(集群):每个集群至少包含两个node.
node:集群中的每个节点,一个节点不代表一台服务器(一台服务器可以存在多个node)
index:一类相同或者类似的doc,比如一个员工索引,商品索引。
type:基于同一index中,逻辑上的数据分类,es 7.x中删除了type的概念
document:ES最小的数据单元 Json,形如这样:

{
    "id": "1",
    "name": "小米",
    "price": {
        "标准版": 3999,
        "尊享版": 4999,
        "吴磊签名定制版": 19999
    }
}

field:一个数据字段,与index和type一起,可以定位一个doc

Shard(分片)

在这里插入图片描述
ES会根据配置,对数据进行分片,将各个分片数据散落在不同节点上来解决单台机器的单机容量瓶颈问题。

1:一个index包含多个Shard,Shard分为Primary Shard(主切片,可读可写)和Replica Shared(副本切片,可读),默认来说,会分配5个Primary Shard,而其中每个Primary Shard默认分配一个Replica Shared。Primary Shard的数量在创建索引的时候设置,如果想修改,需要重建索引(因为涉及到分片节点重新分配)。而Replica Shared可以随时在后续进行修改调整
2:每个Shard都是一个Lucene实例,有完整的创建索引的处理请求能力。
3:es会对nodes的分片进行自动均衡,例如es会在新增节点后,自动进行分片均衡。
4:一个doc是不可能同时存在于多个Primary Shard中的(需要保证文档内容的完整最小粒度,不可被分割),但是可以存在于多个Replica Shared中。
5: Primary Shard和对应的Replica Shared不能同时存在于同一个节点(常规思维理解,都在一个节点,没有意义了,机器宕机,全部玩完),所以最低的高可用配置(注意是高可用,如果非高可用,1个也可以完成工作)是两个节点,互为主备。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值