索引
-
索引名和字段名命名规范:1.英文全小写 2.不要使用驼峰3.多个单词之间用_分隔
-
索引的不可变性:索引创建成功后,索引名称、主分片数量(但可以修改副本数量)、字段类型不可变。
也不可以删除某个字段,但可以新增字段。
查询索引
es8和es6相同
GET /索引名
或
GET /索引名/_mapping
删除索引
es8和es6相同
DELETE 索引名
创建索引
es8
PUT /索引名
{
"settings":{
},
"mappings": {
"properties": {
"field1": {
"type": "text"
},
"field2": {
"type": "keyword"
}
}
}
}
es8中默认一个索引中只有_doc一种type,创建索引时不用指定type,指定type会报错,指定_doc也不行
es6
PUT /索引名
{
"settings":{
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"类型名":{
"properties": {
"新字段": {
"type": "字段类型"
}
}
}
}
}
es6中创建索引必须指定类型,不然会报错
修改索引
一个索引一旦创建后不可以删除字段、修改字段数据类型。但可以修改字段的其他属性,如fielddata等
添加新字段
es6
PUT 索引名/_mapping/类型名
{
"properties":{
"新字段名":{
"type":"新字段类型"
}
}
}
es8
PUT 索引名/_mapping
{
"properties":{
"新字段名":{
"type":"新字段类型"
}
}
}
修改settings
可以通过settings api修改某些settings,比如副本数量、index_refresh_interval、index_max_result_windows
PUT 索引名/_settings
{
"number_of_replicas":3
}
reindex
reindex不是重建索引,而是将一个索引中的数据重建到另一个索引中
POST _reindex
{
"source":{
"index":"源索引名"
},
"dest":{
"index":"目标索引名"
}
}
文档
新增文档
手动指定id,使用PUT
新增文档时可选op_type参数,该参数有create、index两个值。create:不存在则创建,存在则报错。index:不存在则创建,存在则覆盖
# 也可写为 /索引名/_create/文档id
PUT /索引名/_doc/文档id/?op_type=create
{
"字段名":"字段值",
"字段名":"字段值"
}
# 不可写为 /索引名/_index/文档id
PUT /索引名/_doc/文档id/?op_type=index
{
"字段名":"字段值",
"字段名":"字段值"
}
使用index时,如果id为某个值的文档已经存在,则会全量更新!!!
或者
PUT /索引名/_doc/1
{
"字段名":"字段值"
}
也是全量替换!!!
自动生成id,使用POST
# 也可以 /索引名/_doc/id 指定id
POST /索引名/_doc
{
"属性名":"属性值"
}
查询文档
_source
source api控制返回哪些字段
如果设置为false,则只返回元数据
GET /索引名/_doc/文档id?_source=false #此处值默认就是true
也可以使用_source只查询source源数据,不返回元数据
GET /索引名/_source/文档id
_search
POST /goods/_search
{
"query": {
"term": {
"title": "Apple"
}
}
}
除了term精准查询,还有range、match、mulit_match
批量查询文档
GET /_mget
{
"doc":[
{
"_index":"索引名",
"_id":"文档id"
},
{
"_index":"索引名",
"_id":"文档id"
}
]
}
# 可以批量查询多个索引里的多个文档
GET /索引名/_mget
{
"ids":[
1,2
]
}
#根据id批量查询一个索引里的多个文档
修改文档
全量修改
覆盖原来的文档,其本质是根据指定id删除原来的文档,新增一个相同id的文档。如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
PUT /{索引库名}/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
// ... 略
}
其实就是put指定id新增文档
增量修改
只修改指定id匹配的文档中的部分字段
使用_update(只能通过文档id去更新)
POST /索引名/_update/文档id
{
"doc":{
"属性名":"属性值",
"属性名":"属性值"
}
}
# 通过文档id更新
在7.x之前的版本还可以这样写
POST /索引名/_doc/文档id/_update
{
"doc":{
"属性名":"属性值"
}
}
想通过query定制查询条件来更新文档,得通过_update_by_query,而且必须通过写scripts来更新
删除文档
根据query查询条件删除
删除时并不一定每次都知道文档id,通过具体查询条件删除
POST /索引名/_delete_by_query
{
"query":{
"term":{//或match
"字段名":"字段值"
}
}
}
bulk
批量插入文档
POST /_bulk
{"action":{"_index":"索引名","_id":"文档id"}}
{"属性名":"属性值","属性名":"属性值"}
{"action":{"_index":"索引名","_id":"文档id"}}
{"属性名":"属性值","属性名":"属性值"}
# action的值可选index和create,跟前面一样
批量更新文档
POST /_bulk
{"update":{"_index":"索引名","_id":"文档id"}}
{"doc":{"属性名":"属性值","属性名":"属性值"}}
{"update":{"_index":"索引名","_id":"文档id"}}
{"doc":{"属性名":"属性值","属性名":"属性值"}}
批量删除文档
POST /_bulk
{"delete":{"_index":"goods","_id":"100"}}
{"delete":{"_index":"goods","_id":"101"}}
tips:1. 每个bulk写完后,最后要有一个换行2.bulk中的一个失败不会影响其它的