文章目录
今天咱们来聊聊ES的那些事儿。
想象一下,ES就像一个超级聪明的图书馆管理员,它能帮你快速找到任何书(数据),还能保证书不丢、不乱。
现在,咱们一个一个来解答问题。

1. Elasticsearch的数据模型有哪些核心概念?
ES的数据模型就像一座图书馆,核心概念有这几个:
- 索引(Index):相当于图书馆的一个书架,专门放一类书。比如,你建一个“用户信息”索引,就放所有用户数据。
- 文档(Document):书架上的每本书,就是一条数据记录,用JSON格式存储。例如,一个用户文档:
{"name": "张三", "age": 30}
。 - 字段(Field):书里的章节标题,比如“name”或“age”,每个字段有类型(如文本、数字)。
- 映射(Mapping):图书馆的目录系统,定义每个字段的类型和规则。比如,提前说好“age”是数字类型,不能乱填成文字。
- 分片(Shard):书架太大?分成几个小隔层!分片是索引的物理分区,帮助分散存储和查询压力。
- 副本(Replica):每个分片的备份副本,就像复印了一本书放在另一个书架,防止原书丢了。
案例:想象你是个吃货,建了个“美食索引”。
文档就是菜谱(如{"菜名": "红烧肉", "难度": "中等"}
),字段是“菜名”和“难度”,映射确保“难度”不是数字(否则系统会懵:为啥“中等”等于
5
5
5?)。
分片:把菜谱分成“川菜”和“粤菜”两个隔层。
副本:万一川菜隔层着火,副本能顶上——保证你还能查到“麻婆豆腐”的配方!
2. Elasticsearch如何确保数据的一致性和可靠性?
ES像个超级靠谱的快递员,保证数据不丢、不乱。
核心机制是:
- 副本机制:每个分片都有一个或多个副本(replica)。写数据时,先写到主分片,然后异步同步到副本。这样,就算一台服务器挂了,副本顶上,数据还在。
- 一致性模型:默认是最终一致性(数据稍后同步),但你可以调成强一致性(比如写操作必须等所有副本确认)。版本控制(每个文档有版本号)防止冲突。
- 可靠性保障:集群健康监控(如“green”状态表示一切正常),加上事务日志(translog)记录写操作,万一崩溃,能恢复数据。
案例:假设你在网上卖奶茶订单。写一个新订单时,ES先让主分片(好比总店)记录,然后悄悄告诉副本分片(分店):“嘿,有杯珍珠奶茶!”如果总店停电,分店立马接手,顾客不会发现异常。
一致性:默认是“最终一致”——订单可能延迟1秒显示,但你可以设置成“强一致”:顾客必须等所有分店都点头才下单,免得出现“我要少糖”变成“多糖”的悲剧(版本号防错)。
可靠性:ES有自检系统,天天“体检”,确保数据99.999%不丢——比我的减肥计划还可靠!
3. Elasticsearch的中文分词机制是如何实现的?
中文分词就像把一句话切成单词,ES靠分词器(Tokenizer)实现。核心是:
- 分词过程:输入中文文本 → 分词器切成词条(token) → 过滤停用词(如“的”、“是”) → 标准化(如转小写) → 索引存储。
- 常用中文分词器:
- IK Analyzer:最流行,支持细粒度切分。比如“我爱北京天安门”切成“我”、“爱”、“北京”、“天安门”。
- SmartCN:官方自带,基于词典,适合简单场景。
- 自定义词典:你可以加新词,比如“奥利给”当做一个词。
- 底层原理:基于词典匹配或机器学习算法,识别词语边界。计算词频时,用TF-IDF公式(但咱们不深究数学)。
案例:你发帖“今天天气真好,适合打篮球”。ES用IK Analyzer分词:先切成“今天”、“天气”、“真好”、“适合”、“打篮球”。过滤掉“适合”(停用词),索引时只存关键词。如果没分词器,ES可能把“打篮球”切成“打”和“篮球”,结果搜索“篮球”时冒出“打架”内容——乱套了!
好在IK Analyzer聪明,知道“打篮球”是一个整体。
自定义词典:加个“yyds”(永远的神),它就不会切成“y”、“y”、“d”、“s”了。
试试看,输入“ES yyds”,它懂你的意思!
4. Elasticsearch有哪些分片策略?如何设定分片数量和副本数量?
分片策略是ES的“分家艺术”,避免数据堆成山。核心策略:
- 分片策略:
- 静态分片:创建索引时固定分片数,之后不能改。ES默认一个索引有5个主分片(primary shard)。
- 动态调整:副本数(replica)可以随时改(比如从1加到2)。
- 路由策略:数据分配到分片时,基于文档ID哈希计算,确保均匀分布。
- 如何设定数量:
- 分片数:基于数据量和性能。经验法则:每个分片大小在 10 GB 10\text{GB} 10GB到 50 GB 50\text{GB} 50GB之间。计算方式:预估总数据量除以 30 GB 30\text{GB} 30GB(取上限)。分片太多浪费资源,太少查询慢。
- 副本数:至少1个(保证高可用),通常设1-2个。根据集群节点数调整——节点多,副本可增加。
- 设定步骤:创建索引时指定,比如
PUT /my_index { "settings": { "number_of_shards": 3, "number_of_replicas": 1 } }
。
案例:想象你开个网店,索引是“商品库”。分片策略?别把所有鸡蛋放一个篮子!数据量大时,比如有
10000
10000
10000件商品,每个分片
30
GB
30\text{GB}
30GB,算算:
10000
×
0.1
KB
≈
1
GB
10000 \times 0.1\text{KB} \approx 1\text{GB}
10000×0.1KB≈1GB(假设每件商品数据小),那么分片数设1个就够了;但如果商品图片多,总数据
100
GB
100\text{GB}
100GB,分片数就设
4
4
4(
100
/
30
≈
3.33
100 / 30 \approx 3.33
100/30≈3.33,取整)。
副本数:设1个,相当于雇了个备份店员。如果搞错策略——分片太少,查询时像排队结账,慢得要命;分片太多,系统忙得团团转,像无头苍蝇。
设定时记住:分片数是“一锤子买卖”,副本数可灵活调。
下次建索引,先算算数据体积,别让ES“消化不良”哦!
好了,朋友们,ES的核心概念就聊到这里!
记住,ES是个聪明又可靠的伙伴,用好它,你的数据管理就能像吃火锅一样爽快——啥菜都能捞到!😊