ElasticSearch索引的基本操作
#创建索引
PUT /index_name
可以初始不定义
{
"settings":{
//索引设置
"number_of_shards": "1",//索引的分片书决定了索引的并行度和数据分布 不可以动态修改
"number_of_replicas": "1",//副本的数量提高了数据的可用性和容错能力 可以动态修改
},
"mappings":{
//字段映射
"properties": {
"field1":{
"type":"keyword"
},
"field2":{
"type":"text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
}
}
}
#删除索引
DELETE /index_name
#查询索引
GET /index_name
GET /index_name/_settings
GET /index_name/_mappings
#修改索引
PUT /index_name/_settings
PUT /index_name/_mappings
#索引别名
#应用场景
1.在正在运行的集群上进行不同索引切换
2.多个索引分组组合
#创建索引时候指定别名
{
"aliases":{
"alias_name":{}
}
"settings":{}
}
#现有索引添加别名
post /aliases
{
"actions":{
"add":{
"index":"index_name",
"alias":"alias_name"
}
}
}
#使用别名
访问Get alias_name
#多索引检索方案
逗号隔开
get index_name,index1_name/_search
通配符
get index_name_2024*/_search
ElasticSearch文档的基本操作
#新增文档
不指定id存在幂等性问题
post /index/_create/id
{
"field":{}
}
#批量新增文档
支持在一次api调用中,对不同的索引进行操作
操作中单条操作失败,不会影响其他操作
返回结果中包括了每一条的执行结果
post /_bulk
post /{index}/_bulk
post /{index}/{type}/_bulk
request
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
response
{"took": 30,"errors": false,"items": [
//index 用于创建新文档或替换已有旧文档
{"index": {"_index": "test","_type": "_doc","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 201,"_seq_no" : 0,"_primary_term": 1}
},
//delete 用于删除现有文档
{"delete": {"_index": "test","_type": "_doc","_id": "2","_version": 1,"result": "not_found","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 404,"_seq_no" : 1,"_primary_term" : 2}
},
//create 如果文档不存在则创建,如果文档已存在则返回错误
{"create": {"_index": "test","_type": "_doc","_id": "3","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 201,"_seq_no" : 2,"_primary_term" : 3}
},
//用于更新现有文档
{"update": {"_index": "test","_type": "_doc","_id": "1","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"status": 200,"_seq_no" : 3,"_primary_term" : 4}
}
]
}
#查询分词结果
post _analyze
{
"analyzer":"ik_max_word",
"text":"value"
}
#查询文档
根据id查询
get /index_name/_doc/id
同时查询多个id
get index_name/_mget
{
"ids":[id1,id2...]
}
条件匹配文档
GET /index_name/_search
{
"query":{
//匹配所有文档
"match_all":{},
//文本字段匹配(全文检索)
"match":{
"field_name":"value"
},
//精确匹配
"term":{
"field_name":"value"
},
//范围查询
"range":{
"field_name":{
"gte":"lower_bound",
"lte":"upper_bound"
}
}
}
}
#删除文档
单个删除
delete /index_name/_doc/id
批量删除
post _bulk
{"delete":{"_index":"index_name","_id":"value"}}
{"delete":{"_index":"index_name","_id":"value1"}}
条件查询删除
post /index_name/_delete_by_query
{
"query":{
"<your_query>"
}
}
#更新文档
单个更新
post index/_update/1
{
"doc":{
"field":"value"
}
}
并发控制
post /index_name/_doc/id?if_seq_no=1&if_primary_term=3
批量更新
post _bulk
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
post /index_name/_update_by_query
{
"query":{
"<your_query>"
},
"script":{
"source":"ctx._source.field=value"
}
}
Elasticsearch文档建模最佳实践
#嵌套对象(Nested Object)
适用于对少量,子文档偶尔更新,查询频繁的场景
允许对象数组中的对象被独立索引
在内部,Nested文档会被保存在两个Lucene文档中,在查询时做join处理
#Join父子文档类型
适用子文档更新频繁
Join类型用在同一索引的文档中创建父子关系
父文档和子文档是独立的两个文档
父文档和子文档必须在相同的分片上,能够确保查询join的性能
当指定子文档时,必须指定他的父文档id,使用routing参数来保证,分配到相同的分片上
#宽表冗余存储
宽表适用于一对多或者多对多的关联关系
#业务端关联
适用于数据量少的多表关联业务场景
#最佳实践
##如何处理关联关系
object:优先考虑反范式
Nested:当数据包含多数值对象,同时有查询需求
Child/parent:关联文档更新非常频繁时
##避免过多字段
一个文档中,避免大量的字段
过多的字段不容易维护
Mapping信息不保存在Cluster State中,数据量过大,对集群性能会有影响
删除或者修改数据需要reindex
默认最大字段数是1000,可以通过index.mapping.total_fields.limit规定最大字段数
生产环境中,尽量在mapping的dynamic字段中配置strict严格控制新增字段的加入(设置为true时,未知字段会被自动加入;设置为false时,新字段不会被索引,但会保存在_source)
对于多属性的字段,可以考虑适用Nested
避免正则、通配符、前缀查询
属于term查询,性能不够好
避免空值引起的聚合不准
mapping时添加配置字段的属性null_value:0
为索引的mapping加入meta信息
功能:搜索、聚合、排序
性能:存储、内存、搜索的性能
mapping添加_meta属性的index_version_mapping的字段
ElasticSearch复杂查询
问题
Can't update non dynamic settings [[index.analysis.filter
# 关闭索引
POST index/_close
# 设置分词器
PUT index/_settings
{"index": {
}
}
# 开启索引
POST index/_open
标签:知识点,name,index,doc,索引,文档,ElasticSearch,id,小记
From: https://www.cnblogs.com/BitX/p/18513097