elasticsearch基礎(chǔ)知識雜記
日常工作中用到的ES相關(guān)基礎(chǔ)知識和總結(jié)。不足之處請指正,會持續(xù)更新。
1.集群的健康狀況為 yellow 則表示全部主分片都正常運行(集群可以正常服務(wù)所有請求),但是 副本 分片沒有全部處在正常狀態(tài)。
2.主分片的數(shù)目在索引創(chuàng)建時就已經(jīng)確定了下來。但是,讀操作——搜索和返回數(shù)據(jù)——可以同時被主分片 或 副本分片所處理,所以當(dāng)你擁有越多的副本分片時,也將擁有越高的吞吐量。不過要小心副本分片太多,對內(nèi)存對占用太多,可能會降低查詢效率。
3.elasticsearch樂觀并發(fā)控制,利用_version號來確保應(yīng)用中相互沖突的變更不會導(dǎo)致數(shù)據(jù)丟失。如果舊版本的文檔在新版本之后到達(dá),它可以被簡單的忽略。
4.文檔路由到分片:shard = hash(id) % number_of_primary_shards。可以自己指定一個或多個字段做路由,會大大降低查詢耗時。
5.新建、索引和刪除文檔等寫操作,必須在主分片上完成之后才能被復(fù)制到相關(guān)的副本分片。
6.檢索一個文檔,可以從主分片或者任意副本分片檢索。
7.插入,修改或刪除一個文檔,只能從主分片操作。
8.輕量搜索:GET /index/type/_search?q=last_name:Smith , 對字段last_name進(jìn)行query-string搜索。
9.查詢表達(dá)式搜索:比輕量搜索更豐富靈活,支持全文搜索,短語搜索,過濾,排序等。參看DSL查詢語法。
10.評分查詢:計算score和排序。指定一個固定的score: constant_score。不計算score:filter。
11.搜索執(zhí)行:query_and_fetch, query_then_fetdch。
12.存儲優(yōu)化:SSD和普通機械硬盤。按hot-warm標(biāo)簽進(jìn)行分類。
13. index sort采用中斷查詢,加快查詢速度。不過存儲性能大打折扣。
13.倒排索引:你只能搜索在索引中出現(xiàn)的詞條,索引文本和查詢字符串必須標(biāo)準(zhǔn)化為相同的格式。
14.相關(guān)性:TF-IDF + 字段長度。查詢結(jié)果中的_score字段,查看如何具體計算用explain參數(shù)。如果用filter或constant_score查詢,可以不計算score。
15._source字段和_all字段:_source字段存儲整個json文檔體。_all字段把其他字段值當(dāng)做一個大字符串來索引。
16.store是在 _source之外再對指定store的字段存一份,通常用于某字段文本很長,不想放在_source里面,或者該字段經(jīng)常需要做reindex。
17.refresh和flush:refresh把數(shù)據(jù)從內(nèi)存刷到文件系統(tǒng)緩存(lucene flush),并追加translog,這時便可以被search到。flush把數(shù)據(jù)從緩存刷到磁盤并清空translog,持久化數(shù)據(jù)到磁盤(lucene commit)。
18.inner_hits:用于把父子文檔或者嵌套文檔中子文檔命中的部分展示出來,相當(dāng)于在父子之間做了join返回。不用inner_hits的話,父子文檔只返回符合條件的父文檔,不展示命中的子文檔。
19. parent-child:父子文檔在一個索引中,處在獨立的Lucene文件中,主要作用是允許把一個type的文檔和另外一個type的文檔關(guān)聯(lián)起來,一個父文檔,對應(yīng)一到多個子文檔。
與nested相比,parent-child關(guān)系的主要優(yōu)勢有:
- 更新父文檔時,不會重新索引子文檔。而更新nested文檔會重新索引主文檔和所有nested文檔。
- 創(chuàng)建,修改或刪除子文檔時,不會影響父文檔或者其他子文檔。
- 父文檔的id用于子文檔的routing依據(jù)。因為,查找子文檔時要指明父文檔Id。
20.Global Ordinals:某個字段的值,在shard級別映射成的編號。比如字段status的value有IDEL, RUNNING, SUCCESS, FAILED,分別映射成1,2,3,4,可降低agg階段的資源開銷,還能提前加載。
21.High Cardinality:是指某個字段有很多unqiue value。
- High Cardinality會導(dǎo)致構(gòu)建Global Ordinals過程變慢,從而導(dǎo)致聚合查詢變慢、內(nèi)存使用過高。
- High Cardinality會導(dǎo)致壓縮比率降低,從而導(dǎo)致存儲空間增加,特別是像hash值這樣完全隨機的字符串。
- 對High Cardinality字段執(zhí)行Cardinality聚合查詢時,會受到精度控制從而導(dǎo)致結(jié)果不精確。
22.rescore:對查詢出來的結(jié)果中的topN進(jìn)行重新打分和排序。rescore query里如果再有sort會報錯。window_size:topN的取值。query_weight:默認(rèn)值為1,原查詢的打分會先乘以該值,然后再與rescore的得分相加。rescore_query_weight:rescore的打分會先乘以該值,然后在與原查詢的得分相加。rescore_mode: total,max, min, avg, multiply。
23.Ingest Node:預(yù)處理節(jié)點, pipeline中的processor做預(yù)處理。pipeline = processors的集合。用_simulate API測試pipeline的效果。
24.script: doc只可以在search, agg中訪問到;GET操作用params._source取值;POST操作通過ctx._source取值。doc['first.keyword']`這樣的寫法是因為doc[]返回有可能是分詞之后的value,所以你想要某個field的完整值時,請使用keyword。
25.function_score:允許為每個與主查詢匹配的文檔應(yīng)用一個函數(shù),以達(dá)到改變甚至完全替換原始查詢評分"_score"的目的。將檢索與希望重點關(guān)注的因素結(jié)合起來。weight: 設(shè)置權(quán)重,finalscore = _score*weight。field_value_factor:使用這個值來修改_score,如將某些字段作為考慮因素。random_score: 為每個用戶都使用一個不同的隨機評分對結(jié)果排序,但對某一具體用戶來說,看到的屬性始終一致。script_score:用自定義腳本控制評分。
26.Analyzer: 包含3個部分:1. Character Filters:字符過濾。2. Tokenzier:詞項劃分。3. Token Filters:詞項過濾。可以采用 **_analyze** API檢驗分詞器的效果。
27.配置優(yōu)先級:Transient settings > Persistent settings > command-line settings > config file settings
28.Doc value:存儲文檔Id與字段內(nèi)容的對應(yīng)關(guān)系,存儲于磁盤加載到文件系統(tǒng)緩存, 通常也被叫做正排索引。text字段沒有doc value,可以把該類字段再存一個keyword。keyword類型的字段默認(rèn)存doc value,如果不想存doc value可以顯示禁止。
29. FieldData: 基于內(nèi)存,針對text字段。Fielddata 和 doc_value的比較。
相同點:
- 都要創(chuàng)建正排索引,數(shù)據(jù)結(jié)構(gòu)類似于列式存儲
- 都是為了可以聚合,排序之類的操作
不同點:
- fielddata: 內(nèi)存存儲;doc_values: OS Cache+磁盤存儲
- fielddata: 對應(yīng)的字段類型是text; doc_values:對應(yīng)的字段類型是keyword
- field_data主要針對的是分詞字段;doc_values針對大是不分詞字段
- fielddata默認(rèn)不開啟;doc_values默認(rèn)是開啟
30. query cache:緩存filter/range/must_not的最終結(jié)果。segment的文檔數(shù)量小于10000或者小于總index數(shù)量的3%時,查詢是不會緩存的。
31. request cache:緩存shard級別的查詢結(jié)果。不緩存size>0的結(jié)果,比如具體的hits。緩存hits.total, aggregations, suggestions.
32. cache policy:LRU。緩存的結(jié)果會隨著segment merge或者shard refresh而無效。cache key是request的json body。如果json body發(fā)生變化,則不能利用緩存。即使同一個請求,但是條件的順序不同,也不行。cache會刷掉,每次refresh或者segment merge會刷cache。保存cache又比較耗時。
33. Data Frames:用于提升agg的performance。提前從A索引根據(jù)字段和agg條件做好aggreation存入B索引,方便查找和展示。
34. Minimal Snapshot:只snapshot索引的name, _source和metadata,restore的時候通過reindex重做索引。節(jié)約snapshot的存儲空間,但索引restore的時間會變長。
35. Suggester:將輸入的文本切分成token,然后在索引的字典里查找相似的term并返回。

浙公網(wǎng)安備 33010602011771號