ElasticSearch 基本操作
集群健康
GET /_cluster/health
cluster-health
会返回一个 JSON 响应
{
"cluster_name" : "demeter-elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 3,
"active_shards" : 3,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
这里主要看一下status字段,状态有三个值 green、yellow、red
green
所有的主分片和副本父分片都已分配,集群100%可用。
yellow
所有的主分片已经分片,但至少还有一个副本分片是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过高可用性在某种程度上被弱化。如果更多的分片消失,就会丢数据。
red
至少一个主分片(以及它的全部副本)都在丢失中。搜索只能返回部分数据,而分配到这个分片的写入请求会返回一个异常。
-
number_of_nodes
和number_of_data_nodes
这个命名完全是自描述的。 -
active_primary_shards
指出你集群中的主分片数量。这是涵盖了所有索引的汇总值。 -
active_shards
是涵盖了所有索引的所有分片的汇总值,即包括副本分片。 -
relocating_shards
显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。 -
initializing_shards
是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于initializing
状态。这通常会是一个临时事件,分片不应该长期停留在initializing
状态。你还可能在节点刚重启的时候看到initializing
分片:当分片从磁盘上加载后,它们会从initializing
状态开始。 -
unassigned_shards
是已经在集群状态中存在的分片,但是实际在集群里又找不着。通常未分配分片的来源是未分配的副本。比如,一个有 5 分片和 1 副本的索引,在单节点集群上,就会有 5 个未分配副本分片。如果你的集群是red
状态,也会长期保有未分配分片(因为缺少主分片)。
索引的基本操作
创建索引
number_of_shards:分片数
number_of_replicas:副本数
PUT /index_test
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
}
}
查看索引
GET _cat/indices?v
删除索引
DELETE /index_test
创建索引的同时创建mappings映射
PUT /index_mapping
{
"mappings": {
"properties": {
"realname": {
"type": "text",
"index": true
},
"username": {
"type": "keyword",
"index": false
}
}
}
}
index默认true,设置为false的话,name这个字段就不会被索引。
某个属性一旦被建立,就不能修改了,但是可以新增额外属性
主要数据类型
text, keyword,
stringlong, integer, short, byte
double, float
boolean
date
object
数组不能混,类型一致
keyword:不会被分词,不会被倒排索引,直接匹配搜索。
text:可以被倒排索引。
文档的基本操作
添加
POST /my_doc/_doc/1 -> {索引名}/_doc/{索引ID}(是指索引在es中的id,而不是这条记录的id,比如记录的id从数据库来是1001,并不是这个。如果不写,则自动生成一个字符串。建议和数据id保持一致> )
POST /my_doc/_doc/1001
{
"id": 1001,
"name": "test",
"desc": "nice to meet you",
"create_date": "2020-02-22"
}
在es中并没有my_doc
这个索引,索引也没有手动建立mappings,但是在插入文档时会创建索引,并且会根据文档类型自动设置属性类型,这个就是es的动态映射,在index索引库中去建立数据结构的相关配置信息。
发现name、desc字段会有
fields
属性,
-
“fields”: {“type”: “keyword”}
:对一个字段设置多种索引模式,使用text类型做全文索引,也可使用keyword做聚合和排序。 -
“ignore_above” : 256
:设置字段索引和存储的长度最大值,超过则被忽略
修改
-
局部
POST /my_doc/_doc/1001/_update { "doc": { "name": "demeter" } }
-
全局
PUT /my_doc/_doc/1001 { "id": 1001, "name": "demeter-put", "desc": "no problem", "create_date": "2020-02-23" }
每次更新之后 version会修改
删除
DELETE /my_doc/_doc/1001
- 文档删除不是立即删除,文档还是保存在磁盘上,索引增长越来越多,才会把那些曾经标识过删除的,进行清理,从磁盘上移出去。
查询
查看单一文档
GET /my_doc/_doc/1001
查询全部文档
GET /my_doc/_doc/_search
元数据
- index:文档数据所属那个索引,理解为数据库的某张表即可。
- type:文档数据属于哪个类型,新版本使用_doc。
- _id:文档数据的唯一标识,类似数据库中某张表的主键。可以自动生成或者手动指定。
- score:查询相关度,是否契合用户匹配,分数越高用户的搜索体验越高。
- version:版本号。
- source:文档数据,json格式。
定制结果集
GET /my_doc/_doc/1001?_source=id,name
GET /my_doc/_doc/_search?_source=id,name
判断文档是否存在
HEAD /my_doc/_doc/1001
乐观锁
Elasticsearch是分布式的。创建,更新或删除文档时,必须将文档的新版本复制到群集中的其他节点。Elasticsearch也是异步和并发的,这意味着这些复制请求是并行发送的,并且可能不按顺序到达其目的地。Elasticsearch需要一种方法来确保文档的旧版本永远不会覆盖新版本。
在创建一个文档时,并为其分配 _seq_no
和_primary_term
两个客户端同时更新一个文档,第一个人根据文档当前的 _seq_no 和 _primary_term 去更新文档,更新成功,同时文档的 _seq_no 和 _primary_term 会增加;如果此时第二个人用增加前的 _seq_no 和 _primary_term 尝试更新文档,会失败;当更新失败的时候,就需要程序去处理更新失败的问题;通过这种机制,保证并发写的正确性;
内置分词器
分词
把文本转换为一个个的单词,分词称之为analysis。es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体。
英文示例:
POST /_analyze
{
"analyzer": "standard",
"text": "php is the best language in the world"
}
中文示例:
POST /_analyze
{
"analyzer": "standard",
"text": "德墨忒尔"
}
es的内置分词器
standard:默认分词,单词会被拆分,大小会转换为小写。
simple:按照非字母分词。大写转为小写。
whitespace:按照空格分词。忽略大小写。
stop:去除无意义单词,比如the/a/an/is…
keyword:不做分词。把整个文本作为一个单独的关键词。
中文分词器
github地址:https://github.com/medcl/elasticsearch-analysis-ik
将elasticsearch-analysis-ik-7.6.0.zip安装包上传到 /home/software
解压/usr/local/elasticsearch-7.6.0/plugins/ik
即可
unzip elasticsearch-analysis-ik-7.6.0.zip -d /usr/local/elasticsearch-7.6.0/plugins/ik
若没有unzip命令 先安装unzip
yum install -y unzip zip
ik中文分词有两种分词器
ik_max_word: 会将文本做最细粒度的拆分
-
ik_smart: 会做最粗粒度的拆分
ik_max_word会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”
ik_smart会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”
自定义中文词库
- 在{es}/plugins/ik/config下,创建:
vim custom.dic
-
添加自定义词语
德墨忒尔 很方
-
配置自定义扩展词典
vim /usr/local/elasticsearch-7.6.0/plugins/ik/config/IKAnalyzer.cfg.xml
IK Analyzer 扩展配置 custom.dic 重启es