如何管理索引的生命周期?
答:
方法一:
- 建立policy
- 建立template & 關聯policy (
)"index.lifecycle.name": "datastream_policy"
- 建立索引—走模闆—應用政策
方法二:
- 索引已經存在,模闆已經存在
- 修改模闆關聯policy
- 通過模闆建立的新索引将應用該policy
方法三:
- 索引已經存在
-
直接對索引加policy,立即生效
這時,policy的各個phase的min_age都會被比較,然後哪個比對上了,就執行哪些action
PUT mylogs-pre-ilm*/_settings
{
"index": {
"lifecycle": {
"name": "mylogs_policy_existing"
}
}
}
如何關聯ILM policy到具體的索引?
答:
一、可以關聯到模闆,在rollover使用該模闆建立新的索引時,應用該policy,
二、在單獨建立索引時,在settings中進行配置
1:建立模闆
PUT _template/datastream_template
{
"index_patterns": [“datastream-demo*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": “xxxx",
"index.lifecycle.rollover_alias": “datastream-demo”,
}
}
##比對全部的datastream-*的索引
2:這個時候不要配置滾動政策,隻針對目前索引就行了,因為滾動後産生的索引不會繼承這個lifecycle的屬性
PUT test-index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy"
}
}
——————————————————————————————
ES Policy的phases & actions
1.index的phases都有哪幾種?
答:
四種,hot(一直被寫入的),warm(隻讀的),cold(不寫入了,查詢也很慢了),delete(不再需要可以删除的)
- hot:The index is actively being written to
- warm:The index is generally not being written to, but is still queried
- cold:The index is no longer being updated and is seldom queried. The information still needs to be searchable, but it’s okay if those queries are slower.
- delete:The index is no longer needed and can safely be deleted
2.Policy的參數
min_age: 從索引建立到現在經過的時間,如果發生了滾動,那就是從滾動到現在的時間
(時間檢查的配置:indices.lifecycle.poll_interval=0預設,時間機關:
d-Days,h-Hours,m-Minutes,s-Seconds,ms-Milliseconds,micros-Microseconds,nanos-Nanoseconds)
actions:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/_actions.html
——————————————————————————————
Metricbeat采集資料,采用自定義的Template,并配置日期、大小滾動和自動删除;都需要哪些流程和配置
答:
如果開啟了Security,那麼就需要先為Metric建立對應的賬号,并且增加對應的權限( manage_ilm等)詳細參考ndex lifecycle management API,在elasticsearch7.0之後都是用内置的ilm(index lifecycle management)來管理這項功能的。
step1:授權(一般有固定的采集賬号,built-in user)
step2:開啟配置
setup.ilm.enabled: auto
#滾動的别名
setup.ilm.rollover_alias: "metricbeat-demo"
#滾動的字尾
setup.ilm.pattern:"{now/d}-000001"
#最終的别名=
setup.ilm.rollover_alias+setup.ilm.pattern
setup.template.enabled: true
#模闆名稱(如果ilm配置的Indexname沒能比對模闆,那麼将不走目前配置的模闆)
setup.template.name: "metricbeat-physical-machine"
#比對模型
setup.template.pattern: "metricbeat-physical-machine*"
#模闆字段配置
#setup.template.fields: "fields.yml"
setup.template.overwrite: true
#索引的分片和壓縮
setup.template.settings:
index.number_of_shards: 3
index.codec: best_compression
output.elasticsearch:
#hosts: ["172.16.22.158:9200", "172.16.22.159:9200", "172.16.22.160:9200"]
hosts: ["localhost:9200"]
index: "metricbeat-%{[agent.version]}-physical-machine-%{+yyyy.MM.dd}"
——————————————————————————————
1.如何調整單個索引中的最大字段數?
答:
在建立模闆時增加配置:
"mapping.total_fields.limit" : 5000
"settings" : {
"index" : {
"codec" : "best_compression",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"mapping.total_fields.limit" : 5000
}
},
2.如果一個已經建立好的索引,如何修改其最大字段數?
put http://host:port/_indexName/_settings
{
{"index.mapping.total_fields.limit":2000}
}
——————————————————————————————
一、模闆
- 如何建立模闆?建立模闆的注意事項?
- 如何檢視已有模闆?
- 如何檢視指定模闆的詳細資訊?
- 如何修改模闆?
-
如何删除模闆?
DELETE /_template/
-
一個建立索引命中多個模闆時是如何應用的?
答:先比對order小的,再比對order大的,後者會向前覆寫,最終看settings & mappings,會覆寫之前的
-
什麼是dynamic template,有什麼特性?
答:
二、索引與文檔
- 如何建立索引?
put demo_index
{
"mappings" : {
"properties" : {
"my_text": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name": {
"type":"text"
}
}
}
}
- 如何檢視已有索引?
get /_cat/indices
get /my_index
- 如何檢視索引屬性?
- 如何修改索引?
- 為索引添加别名
PUT /Index/_alias/alias1
- 删除别名
DELETE /<index>/_alias/<alias>
- clone Index
POST /my_source_index/_clone/my_target_index
- 關閉索引
POST /<index>/_close
- 重新整理索引tranlog中的資料
POST /<index>/flush
GET /<index>/flush
- 什麼是正排索引和反向索引?
-
反向索引的核心組成?
①單詞詞典:記錄所有文檔的單詞——記錄單詞到反向索引的關系,用B+ Tree或者HASH拉鍊法實作,滿足高性能的插入和查詢
②倒排清單:記錄了單詞對應的文檔集合,由反向索引項組成——文檔ID + 詞頻TF + 位置Position + 偏移Offset
補充:詞頻:用于相關性評分,
位置:用于語句搜尋Phrase query;
偏移:用于高亮
1.如何添加文檔?
①PUT my_index/_create/【如果文檔存在,建立失敗】,可以主動指定 或者 ES自動生成ID
②PUT my_index/_doc/1?op_type=create 【同上】
③PUT my_index/_doc/ 【如果文檔存在,則先删除,再索引進去,同時Version +1】
2. 如何添加比預期Mapping結構更加複雜的文檔?
3. 如何修改文檔?
POST /my_index/_update/
【不會删除原來的文檔,實作真正更新】
4. 如何删除文檔?
5. 如何批量操作(Index,Create,del,update)?
POST _bulk
{
}
6.如何批量讀取?
GET _mget {}
7.如何批量查詢?
GET my_index/_msearch{}
三、分詞器
- Elasticsearch内置的分詞器有哪些,都是什麼作用?
-
如何對分詞器進行測試?
①對分詞器進行效果測試:
Get /analyze
{
“"
}
②對索引中的某個字段進行測試
③細緻定義tokenizer & filter
-
Analyzer的組成?
答:character Filters、tokenizer、Token Filters、
- 中文分詞器?
四、搜尋
1.查詢方式有幾種?
①URI
q=指定查詢語句
df=預設字段,不指定時對全部字段進行查詢
sort=排序
from/size=分頁
profile=檢視查詢是如何被執行的(”profile”:true)
範圍查詢
通配符查詢
正則查詢
模糊查詢
近似比對查詢
②request body
③CURL
2.precision & recall 的含義?
答:
precision:被召回的正确相關結果/全部的傳回結果(正确相關結果+不相關的結果),即被召回的正确率
recall:被召回的正确相關結果/正确的相關結果(正确相關結果+未被召回的相關結果),
3.term query 和 phrase query和Boolean query 差別?
①"phrase query”:(
PhraseQuery
)要把查詢的内容用”“圈起來,表示要被查詢的内容同時出現,并且順序一緻,and的關系
②term query:(
DisjunctionQuery
)不需要””,詞組之間各個詞是or的關系,出現一個即可
③(boolean query):(
BooleanQuery
)需要把查詢内容用()圈起來,表示分組的概念,即包含了boolean 或者包含了query的
五、Mapping
1.Mapping的類型:Dynamic Mapping &
2.Mapping的字段類型能否修改?
答:
不能,除非Reindex,如果是新增的字段,并且dynamic設定為true時,無影響,切Mapping會被更新
3.如何建立Mapping?
PUT my_index
{
"mappings":{}
}
4.常用的Mapping Parameters?
5.什麼是多字段類型?
五、運維
1.如何配置冷熱節點?
2.資料節點的記憶體和存儲配置?
3.如何配置Master、data、coordinate、Machine learning節點類型?
4.如何自定義配置character Filters、tokenizer、Token Filters?各個階段都做了哪些操作?
答:
在建立索引的時候,在settings中進行配置,待查文檔
5.讀寫分離如何配置?
四、分片
1.如何修改主分片數?
答:
預設主分片數是在建立索引時設定的,且不允許修改,如果需要修改,則隻能ReIndex。
2.分片數的設定原則?
3.叢集狀态與分片的關系?
答:
Green:主分片與副本分片都正常分片 ;
Yellow:主分片正常配置設定,有副本分片未能正常配置設定;
Red:有主分片未能配置設定;
六、安全
1.使用者管理——建立/更新使用者
POST /_security/user/<username>
PUT /_security/user/<username>
POST /_security/user/jacknich
{
"password" : "[email protected]",
"roles" : [ "admin", "other_role1" ],
"full_name" : "Jack Nicholson",
"email" : "[email protected]",
"metadata" : {
"intelligence" : 7
}
}
2.修改密碼
POST /_security/user/_password
POST /_security/user/<username>/_password
POST /_security/user/jacknich/_password
{
"password" : “s3cr3t"
}
3.删除使用者
DELETE /_security/user/<username>
DELETE /_security/user/jacknich
4.禁用使用者
PUT /_security/user/<username>/_disable
PUT /_security/user/jacknich/_disable
5.啟用使用者
PUT /_security/user/<username>/_enable
PUT /_security/user/jacknich/_enable
6.檢視使用者
GET /_security/user
GET /_security/user/<username>
GET /_security/user/jacknich
7.啟用使用者
PUT /_security/user/<username>/_enable
PUT /_security/user/jacknich/_enable
角色:
1.建立角色
POST /_security/role/<name>
PUT /_security/role/<name>
POST /_security/role/my_admin_role
{
"cluster": ["all"],
"indices": [
{
"names": [ "index1", "index2" ],
"privileges": ["all"],
"field_security" : { // optional
"grant" : [ "title", "body" ]
},
"query": "{\"match\": {\"title\": \"foo\"}}" // optional
}
],
"applications": [
{
"application": "myapp",
"privileges": [ "admin", "read" ],
"resources": [ "*" ]
}
],
"run_as": [ "other_user" ], // optional
"metadata" : { // optional
"version" : 1
}
}
2.删除role
DELETE /_security/role/<name>
DELETE /_security/role/my_admin_role
1.Creates and updates role mappings.(must have at least the manage_security cluster privilege)
POST /_security/role_mapping/<name>
PUT /_security/role_mapping/<name>
assigns the “user” roles to all users.
POST /_security/role_mapping/mapping1
{
"roles": [ "user"],
"enabled": true,
"rules": {
"field" : { "username" : "*" }
},
"metadata" : {
"version" : 1
}
}
2.Retrieves role mappings.
GET /_security/role_mapping
GET /_security/role_mapping/<name>
GET /_security/role_mapping/mapping1
{
"mapping1": {
"enabled": true,
"roles": [
"user"
],
"rules": {
"field": {
"username": "*"
}
},
"metadata": {}
}
}
3.Removes role mappings.
DELETE /_security/role_mapping/<name>
DELETE /_security/role_mapping/mapping1
4.Evicts roles from the native role cache.
POST /_security/role/<name>/_clear_cache
5.Evicts users from the user cache:(移除使用者緩存)
使用者的憑據會緩存到每個節點的記憶體上,避免每次請求都去一個遠端服務或者去磁盤上查找
POST /_security/realm/<realms>/_clear_cache
POST /_security/realm/<realms>/_clear_cache?usernames=<usernames>
5.1修改使用者角色
6.如何使用api_key?
考試:
- 寫入的資料是如何變成elasticsearch裡可以被檢索和聚合的索引内容的?
- lucene如何實作準實時索引?
- 什麼是segment?
- 什麼是commit?
- segment的資料來自哪裡?
- segment在寫入磁盤前就可以被檢索,是因為利用了什麼?
- elasticsearch中的refresh操作是什麼?配置項是哪個?設定的指令是什麼?
- refresh隻是寫到了檔案系統緩存,那麼實際寫入磁盤是由什麼控制呢?如果這期間發生錯誤和故障,資料會不會丢失?
- 什麼是translog日志?什麼時候會被清空?什麼是flush操作?配置項是什麼?怎麼配置?
- 什麼是段合并?為什麼要段合并?段合并線程配置項?段合并政策?怎麼forcemerge(optimize)?
- routing的規則是什麼樣的?replica讀寫過程?wait_for_active_shards參數timeout參數 ?
- reroute 接口?
- 兩種 自動發現方式?
- refresh和flush的差別是什麼?