Elasticsearch笔记_3
自动补全
与
IK分词器一样, 拼音分词器作为插件安装在ES中即可
- pinyin
- 解压, 移动到
plugin/, 重启elasticsearch
自定义分词器
ES中分词器包含三个部分
character filters: 在tokenizer之前对文本进行处理, 比如删除字符, 替换字符tokenizer: 将文本按照一定规则切割成词条term, 比如keyword就是不分词, 还有ik_smarttokenizer 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!





