Elasticsearch笔记_3
自动补全
与
IK
分词器一样, 拼音分词器作为插件安装在ES
中即可
- pinyin
- 解压, 移动到
plugin/
, 重启elasticsearch
自定义分词器
ES
中分词器包含三个部分
character filters
: 在tokenizer
之前对文本进行处理, 比如删除字符, 替换字符tokenizer
: 将文本按照一定规则切割成词条term
, 比如keyword
就是不分词, 还有ik_smart
tokenizer filter
: 将tokenizer
输出的词条进一步进行处理, 比如大小写转换, 同义词处理, 拼音处理
- 创建索引库的时候, 使用
settings
配置自定义的analyzer
分词器
1 | PUT /test |
拼音分词器只适合在创建倒排索引的时候使用, 不能在搜索的时候使用, 不然当用户输入中文的时候, 会根据其拼音搜索到其他同音词
通过指定
search_analyzer
, 可以指定搜索使用不同的分词器
completion suggester
查询
这个查询匹配以用户输入内容开头的词条并返回, 为了提高补全查询的效率, 对于文档字段类型有一些约束
参与补全查询的字段必须是
completion
类型字段的内容一般是用来补全的多个词条形成的数组
1 | GET /test/_search |
数据同步
方案1: 同步调用
- 实现简单, 依次执行, 业务耦合, 影响性能
方案2: 异步通知
- 依赖
MQ
, 解除耦合
方案3: 监听binlog
- 开启
binlog
增加数据库负担, 实现起来复杂一些
集群
搭建
单机会有海量数据, 单点故障问题
海量数据存储: 将索引库逻辑上拆分成
N
片(shard
), 存储到多个节点(node
)中单点故障问题: 分片数据存储在不同的节点备份(
replica
)所以一个分片的主分片和副本分片不会在同一个节点上
编写docker-compose
1 | version: '2.2' |
需要修改权限
1 | vi /etc/sysctl.conf |
监控集群状态
kibana
可以监控, 但是一般只能监控一个节点, 如果要监控整个集群, 需要安装es-x-pack
插件, 比较复杂- 所以使用
cerebro
监控集群状态, cerebro - 解压运行即可
指定分片信息
- 可以在创建索引库的时候指定分片信息
1 | PUT /idxName |
节点角色
节点类型 | 配置参数 | 默认值 | 职责 |
---|---|---|---|
master eligible |
node.master |
true |
备选主节点, 主节点可以管理和记录集群状态, 决定分片在哪个节点上, 处理创建和删除索引库的请求 |
data |
node.data |
true |
数据节点, 存储数据, 搜索, 聚合, CRUD |
ingest |
node.ingest |
true |
数据存储之前的预处理 |
coordinating |
上面三个参数均为false 则为coordinating |
无 | 路由请求到其他节点, 合并其他节点的结果, 返回 |
脑裂问题
- 默认情况下, 每个节点都是
master eligible
节点, 一旦master
节点宕机, 其他候选节点会选举成为一个主节点, 主节点与其他节点网络故障时, 可能发生脑裂问题 - 为了避免脑裂问题(一个集群中出现两个主节点), 要求选票超过(
eligible
节点数量 + 1) / 2才能当选主节点- 因此
eligible
节点个数最好为奇数, 对应配置项是discovery.zen.minimum_master_nodes
es 7.0
以后, 已经成为默认配置, 所以一般不会发生脑裂问题
- 因此
数据分片规则
coordinating node
根据hash
算法计算文档应该在哪个分片中-
_routing
默认是文档ID
- 算法与分片数量有关, 索引库一旦创建, 分片数量不能修改
ES
查询分两个阶段:
scatter phase
: 分散阶段,coordinating node
将请求发到每一个分片上gather phase
: 聚集阶段,coordinating node
汇总data node
的搜索结果, 处理为最终结果集返回给用户
故障转移
master
节点监控集群中的节点状态, 假设一个节点宕机, 会立即将宕机节点的分片数据转移到其他节点, 确保数据安全如果是主节点宕机了,
Eligible Master
节点会重新选举出主节点
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sangs Blog!