搜索引擎
- 分类
- 网页
- 业务
- 日志
- 特点
- 数据量很大
- 搜索内容条件是完全随机
- 如果用传统数据库Oracle存储?
- 不能,大容量下,做模糊匹配,性能非常差
- 如果Hbase大数据数据库?
- 不能,索引能力非常差
- ES应用场景:基于大数据量构建全文索引
ES的特点
分布式
全文检索
NRT(近实时)
ES概念和存储结构
- Index:
索引库
- 类似于数据库的概念
- 里面存储的是所有数据的索引
- Type:
索引类型
- 类似于数据库中表的概念
- 这是一个逻辑上的概念,物理上没有区分
- 问题:如果一个 索引库中的两个索引类型中出现了相同的列名,但类型不一样
- 物理上属于同一列
- 逻辑上属于不同列
- 读取数据时就会出现问题
- 6.x开始:每个Index中只能有一个Type
- 后期Type这个概念会被取消
- 任何一条Document,虽然在物理上属于Index,但是在访问时必须加上Type才能访问
- Document:
一条数据
- 就是存储在ES中的一条数据,类似于Hbase 中的一条Rowkey的数据
- Document = DocumentId + data【fields】
- DocumentId类似于Rowkey,是ES为每个索引类型都自带的一列,值由我们自己定义
- 用于作为唯一标识
- 用于分区规则:按照documentId的hash取余分区的个数
- Fields:真正数据中存储的列
- Shard:分片
- 默认每个索引库都会有5个主分区
- Replicas:副本
- 默认每个主分区都会有1个副本分区
- 如果我们创建一个索引库,这个索引库会创建10个分区
- 角色
- 主分区:对外提供读写服务
- 副本分区:与主分区同步数据
- 注意
- 任何一个分区的总个数【主分区+副本分区】不允许超过机器个数
- 架构
- 分布式主从
- Master
- Node
- 主从节点、主副分区选举都由自己完成
- 自己实现了 类似于Zookeeper的功能
- 分布式主从
RestfulAPI
- PUT:创建、插入、更新
- GET:查询
- GET /index/type/documentId
- 查询某一条数据
- GET /index/_search + Query
- 查询多条数据
- 常见的查询器
- match/matchAll
- term
- range
- bool
- exists
- 浅分页
- 深分页
- GET /index/type/documentId
- DELETE:删除
mapping和setting
- mapping:用于管理索引库中字段属性
- 字段名称
- 字段类型
- 是否索引
- 是否分词
- ……
- setting:用于整个ES的配置管理
- 配置分片已及副本个数
- 配置分词器
分词器
- 应用
- 存储数据:对数据进行分词构建倒排索引
正常索引
:通过id找到这条数据位置倒排索引
:通过数据得到符合的id- 通过id获取所有数据位置
- 检索数据:对搜索词进行分词
- term:精准匹配,不分词
- match:模糊匹配,分词
- 搜索引擎
- 存储数据:对数据进行分词构建倒排索引
- 分词器的本质是根据词库中的词进行分词
- 词库肯定是动态的
- 动态更新词库
ES中的读写流程以及存储过程
- 类似于Impala
- 哪台ES节点接受请求,哪台就是中心调度节点,负责这个请求的转发以及返回结果
- 类似于Zookeeper
- 自己实现了选举的集群管理
- 主从节点都会存储数据
- 每个索引库中的主从分片都提供读
- 只有主分片对外提供写,同步给所有从分片
- 类似于Kafka
- 通过副本来保证分区可用性,每个分区可以有多个副本
- 主分区对外提供写,从分区负责同步
- 主分区与从分区数据不一致
- 如果主分区故障,从分区用于重新选举一个新的主分区
- 类似于hbase
- hbase
- 写
- wal
- memstore
- flush
- compact
- 读
- memstore
- blockcache
- storefile
- 写
- es
- 写
- buffer:translog
- os cache
- flush
- merge
- 读
- os cache
- segmentfile
- 写
- hbase
没有删除和更新,都是做标记,在合并的时候删除
Java API
- JDBC/Hive/Hbase/HDFS
- 客户端连接服务端
- 先构建连接
- 指定连接地址:用户名、密码
- 构建客户端
- 所有操作都是客户端对象中方法
- 先构建连接
- 如何构建ES客户端
- 写
- JSON
- JAVA Bean:fastJson
- bulk
- 读
- 根据某个documentId来获取数据
- 构建查询器
- range
- term
- match
- bool