简介
Elasticsearch 是一个基于Apache Lucene、分布式、搜索和数据分析引擎。
搜索引擎
准实时
NoSQL
海量存储
天生分布式
基础概念
索引、类型、文档、字段
ElasticSearch | MySQL | |||
index | 索引 | database | 库 | |
type | 类型 | table | 表 | |
document | 文档 | row | 行 | |
field | 字段 | column | 列 |
字段
字段索引
多重含义
名词
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构
动词
此项分析过程
倒排索引
数据 |
数据检索 | 结构化数据 | 检索 | 索引 B Tree |
非结构化数据 | 全文检索 | 倒排索引 inverted index |
全文检索
结构化数据,以事先设定的特定结构,长度存储,类似关系型数据库(MySQL),检索相对方便简单。
非结构化数据,没有特定结构,没有特定长度,例如,网页,邮件,文章。对于非结构化数据的检索,称之为全文检索。
倒排索引
倒排列表
倒排文件
文档分析:文档的词项提取称之为文档分析,是全文检索的核心过程。
DocumentId | Document |
1 | 我在西安。 |
2 | 我在西安工作。 |
DocumentId | Term |
1 | 我 西安 |
2 | 我 西安 工作 |
Term | TF | DocumentId:Position | Offset | |
我 | 2 | 1:0,2:0 | <0,1>,<0,1> | 倒排列表 |
在 | 2 | 1:1,2:1 | <1,2>,<1,2> | 倒排列表 |
西安 | 2 | 1:2,2:2 | <2,4>,<2,4> | 倒排列表 |
工作 | 1 | 2:3 | <4,6> | 倒排列表 |
![](https://i-blog.csdnimg.cn/blog_migrate/0725c8bc7ba17e1dd94e3e0cdd6f4c9b.jpeg)
正向索引
![](https://i-blog.csdnimg.cn/blog_migrate/37bc83a53e46e7851c171a92cb6903fd.png)
字段参数
{
"mappings":{
"dynamic":"true",
"properties":{
"brand_name":{
"type":"text",
"term_vector":"with_positions_offsets",
"analyzer":"ik_smart"
},
"cover_img":{
"type":"text"
},
"is_supplier_send":{
"type":"integer"
},
"price":{
"type":"float"
},
"product_name":{
"type":"text",
"term_vector":"with_positions_offsets",
"analyzer":"ik_smart"
},
"sort":{
"type":"integer"
},
"spu_code":{
"type":"keyword"
},
"spu_id":{
"type":"integer"
},
"stock":{
"type":"long"
},
"supplier_category":{
"type":"text"
},
"supplier_category_name":{
"type":"text",
"term_vector":"with_positions_offsets",
"analyzer":"ik_smart"
},
"supplier_code":{
"type":"text"
}
}
}
}
参数 | 默认值 | 说明 |
dynamic | true | 动态处理新添加字段 |
properties | \ | 嵌套类型或对象类型的字段 |
type | 数据类型 | |
term_vector | no | |
analyzer | standard | 分析器 |
search_analyzer | \ | 搜索时使用的分析器 |
index | true | 是否编入索引 |
元字段
![](https://i-blog.csdnimg.cn/blog_migrate/42fa5da57d4c151ef7eb842b5a5779c4.png)
字段限制
为了避免索引中定义太多字段,内存不足,系统崩溃。
index.mapping.total_fields.limit :一个索引中能定义的字段的最大数量,默认是 1000
index.mapping.depth.limit:字段的最大深度,以内部对象的数量来计算,默认是20
index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认是50
字段数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/62768eff8d0da76ae887eb0e95c8db85.png)
mapping
{
"properties": {
"_source": {
"enabled": false
}
}
}
{
"soar" : {
"mappings" : {
"properties" : {
"content" : {
"type" : "text",
"analyzer" : "ik_max_word",
"search_analyzer" : "ik_smart"
}
}
}
}
}
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
// GET my_index/_search
{
"query": {
"match": {
"city": "York"
}
},
"sort": {
"city.raw": "asc"
}
}
分片、副本
分布式系统CAP定理
![](https://i-blog.csdnimg.cn/blog_migrate/a4fc3b9691ba0f2dcd4f17613033f337.png)
CAP 定理的含义: http://www.ruanyifeng.com/blog/2018/07/cap.html
高可用
服务可用性-允许有节点停止服务
数据可用性-部分节点丢失,不会丢失数据
可扩展
动态扩展节点
{
"settings":{
"number_of_shards" : "1",
"number_of_replicas" : "0"
}
}
修改副本数
演示
修改主分片数
演示
节点、节点角色
节点
elasticsearch节点:ES运行的一个实例。
节点角色
master-eligible node
具备选举为主节点资格的节点。
master node
主节点具有修改集群信息的权限。维护集群状态,节点信息,索引、mapping和setting,路由。
data node
保存数据的节点,负责保存分片数据,在分片扩展时至关重要。
coordinating node
负责Client请求,将请求分发到合适节点,将结果汇集。
默认情况下,所有节点都具有改功能职责。
集群
搭建集群
#初始主节点
cluster.initial_master_nodes: ["es1","es2","es3"]
# 开启跨域,为了让es-head可以访问
http.cors.enabled: true
http.cors.allow-origin: "*"
# 集群的名称
cluster.name: soarfreely-cluster
# 节点的名称
node.name: es1
# 指定该节点是否有资格被选举成为master节点,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master
node.master: true
# 允许该节点存储数据(默认开启)
node.data: true
# 允许任何ip访问
network.host: 0.0.0.0
http.port: 9204
transport.tcp.port: 9304
# 通过这个ip列表进行节点发现
#discovery.seed_hosts: ["172.17.0.4:9304","172.17.0.5:9305","172.17.0.6:9306"]
discovery.zen.ping.unicast.hosts: ["172.17.0.4:9304","172.17.0.5:9305","172.17.0.5:9306"]
#如果没有这种设置,遭受网络故障的集群就有可能将集群分成两个独立的集群 – 导致脑裂 - 这将导致数据丢失
discovery.zen.minimum_master_nodes: 2
#(有master资格节点数/2) + 1
transport.tcp.compress: true
脑裂现象
CRUD
CRUD | 事例 | 说明 |
Index | PUT my_index/_doc/1 | 如果不存在,创建,否则先删除。 |
Create | PUT my_index/_create/1
POST my_index/_doc | id存在会报错 不指定id,会自动生成 |
Update | POST my_index/_update/1 | 更新,id不存在会报错 |
Read | GET my_index/_doc/1 | 查询指定id文档 |
DELETE | DELETE my_index/_doc/1 | 删除指定id文档 |
插件
分析器/分词器
字符过滤器:对输入的全文数据做预处理,比如去除html中的<b>标签
分词器:根据词义做分词,需要字典支持
分词过滤器:对分词器处理结果进一步加工,例如字母转小写,去除停止词(的,得,地)
更多插件:http://elasticsearch.cn/article/66
安装插件
ik分词器
两个分词算法:
ik_max_word: 会将文本做最细粒度的拆分
ik_smart: 会做最粗粒度的拆分(最少切分)
在线安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.1/elasticsearch-analysis-ik-7.5.1.zip
离线安装
将elasticsearch-analysis-ik-7.5.1.zip解压文件拷贝到 {install_dir}/plugins/ik
查看
./bin/elasticsearch-plugin list
http://domain/_cat/plugins
自定义字典
客户端API
演示
批量
bulk一次最大处理多少数据量?
Bulk会把将要处理的数据载入内存中,所以数据量是有限制的,最佳的数据量不是一个确定的数值,它取决于硬件,文档大小,复杂性,索引、以及搜索的负载。一般建议是1000-5000个文档,大小建议是5-15M,默认不能超过100M,可以在elasticsearch的配置文件elasticsearch.yml中配置。
http.max_content_length: 100mb