目录
索引操作
创建与删除索引库
创建索引
删除索引
判断索引是否存在
查看索引
查看单个索引
批量查看索引
查看所有索引
打开与关闭索引
打开索引
关闭索引
映射操作
创建映射字段
映射属性详解
查看映射关系
查看单个索引映射关系
查看所有索引映射关系
修改索引映射关系
一次性创建索引与映射
文档操作
新增文档
新增文档(手动指定id)
新增文档(自动生成id)
查看单个文档与所有文档
单个文档
所有文档
文档元数据解读
_source(定制返回结果)
更新文档(局部更新与全局更新)
全部更新
局部更新
删除文档
根据id进行删除
根据查询条件进行删除
删除所有文档
文档全量替换、强制创建
全量替换
强制创建
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
语法
PUT /索引名称 { "settings": { "属性名": "属性值" } }
settings:就是索引库设置,其中可以定义索引库的各种属性 比如分片数 副本数等,目前我们可以不设置,都走默认
语法
DELETE /索引名称1,索引名称2,索引名称3...
查看索引,显示索引不存在
语法
HEAD /索引名称
Get请求可以帮我们查看索引的相关属性信息,格式:
语法
GET /索引名称
语法
GET /索引名称1,索引名称2,索引名称3,...
方式一
GET _all
方式二
GET /_cat/indices?v
绿色:索引的所有分片都正常分配。
黄色:至少有一个副本没有得到正确的分配。
红色:至少有一个主分片没有得到正确的分配。
语法
POST /索引名称/_open
语法
POST /索引名称/_close
语法
PUT /索引库名/_mapping { "properties": { "字段名": { "type": "类型", "index": true, "store": true, "analyzer": "分词器" } } }
字段名:任意填写,下面指定许多属性,例如:
type:类型,可以是text、long、short、date、integer、object等
index:是否索引,默认为true
store:是否存储,默认为false
analyzer:指定分词器更多属性:
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/mapping-params.html
示例
PUT /duia-company-index
PUT /duia-company-index/_mapping
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
},
"logo": {
"type": "keyword",
"index": "false"
},
"payment": {
"type": "float"
}
}
}
1) type
Elasticsearch中支持的数据类型非常丰富:
text:可分词,不可参与聚合
keyword 不可分词,数据会作为完整字段进行匹配,可以参加聚合
基本数据类型:long、integer、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float 需指定一个精度因子,如10或100。es会把真实的值乘以 这个因子后存储,取出时再还原。
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节 省空间。
进行匹配时,任意一个元素满足,都认为满足。
排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序。
{
name:"Jack",
age:21,
girl:{
name: "Rose", age:21
}
}
如果存储到索引库的是对象类型,例如上面的girl,会把girl变成两个字段:girl.name和girl.age
2) index
index影响字段的索引情况。
true:字段会被索引,则可以用来进行搜索。默认值就是true
false:字段不会被索引,不能用来搜索
index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如企业的logo图片地址,需要手动设置index为false
3) store
是否将数据进行独立存储。
原始的文本会存储在 _source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。
4) analyzer
一般我们处理中文会选择ik分词器 ik_max_word ik_smart
语法
GET /索引名称/_mapping
语法
GET _mapping 或 GET _all/_mapping
语法
注意:修改映射增加字段 做其它更改只能删除索引 重新建立映射
PUT /索引库名/_mapping { "properties": { "字段名": { "type": "类型", "index": true, "store": true, "analyzer": "分词器" } } }
我们可以在创建索引库的同时,直接制定索引库中的索引,基本语法:
put /索引库名称
{
"settings": {
"索引库属性名": "索引库属性值"
},
"mappings": {
"properties": {
"字段名": {
"映射属性名": "映射属性值"
}
}
}
}
案例
PUT /lagou-employee-index
{
"settings": {},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
新增文档时,涉及到id的创建方式,手动指定或者自动生成。
语法
POST /索引名称/_doc/{id}
POST /lagou-company-index/_doc/1 { "name": "百度", "job": "小度用户运营经理", "payment": "30000", "logo": "http://www.lgstatic.com/thubnail_120x120/i/image/M00/21/3E/CgpFT1kVdzeAJNbU AABJB7x9sm8374.png" }
语法
POST /索引名称/_doc
POST /lagou-company-index/_doc { "field": "value" }
语法
GET /索引名称/_doc/{id}
语法
POST /索引名称/_search { "query": { "match_all": {} } }
元数据项
|
含义
|
_index
|
document 所属 index
|
_type
|
document 所属 type , Elasticsearch7.x 默认 type 为 _doc
|
_id
|
代表 document 的唯一标识,与 index 和 type 一起,可以唯一标识和定位一个 document
|
_version
|
document 的版本号, Elasticsearch 利用 _version ( 版本号 ) 的方式来确保应用中相互冲突的变更不会导致数据丢失。需要修改数据时,需要指定想要修改文档的version 号,如果该版本不是当前版本号,请求将会失败
|
_seq_no
|
严格递增的顺序号,每个文档一个, Shard 级别严格递增,保证后写入的 Doc seq_no 大于先写入的 Doc 的 seq_no
|
_primary_term
|
任何类型的写操作,包括 index 、 create 、 update 和 Delete ,都会生成一个 _seq_no。
|
found
|
true/false ,是否查找到文档
|
_source
|
存储原始文档
|
某些业务场景下,我们不需要搜索引擎返回source中的所有字段,可以使用source进行定制,如下,多个字段之间使用逗号分隔
语法
GET /索引名称/_doc/{id}?_source=name1,name2,......
Elasticsearch可以使用PUT或者POST对文档进行更新(全部更新),如果指定ID的文档已经存在,则执行更新操作。
注意:Elasticsearch执行全部更新操作的时候,Elasticsearch首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,但是你也无法访问,Elasticsearch会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档。
全部更新,是直接把之前的老数据,标记为删除状态,然后,再添加一条更新的(使用PUT或者 POST)
局域更新,只是修改某个字段(使用POST)
将刚才新增的请求方式改为PUT,就是修改,不过修改必须指定id
比如,我们把使用id为3,不存在,则是新增
可以看到是 created 新增。把数据改一下,再次执行刚才的请求
可以看到结果是: updated 更新数据
语法
POST /索引名/_update/{id} { "doc":{ "field":"value" } }
语法
DELETE /索引名/_doc/{id}
语法
POST /索引库名/_delete_by_query { "query": { "match": { "字段名": "搜索关键字" } } }
语法
POST 索引名/_delete_by_query { "query": { "match_all": {} } }
语法与创建文档一样,如果文档id不存在,则创建;如果文档id已经存在,就是全量替换操作,替换文档的json串内容;
文档是不可变的,如果要修改文档的内容,第一种方式就是全量替换,直接对文档重新建立
索引,替换里面所有的内容,elasticsearch会将老的文档标记为deleted,然后新增我们给定的一个文档,当我们创建越来越多的文档的时候,elasticsearch会在适当的时机在后台自动删除标记为deleted的文档 。
语法
PUT /lagou-company-index/_doc/4?op_type=create {}