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