ElasticSearch知識點小記

梦回大唐meng發表於2024-10-29

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