免費(fèi)制作單頁的網(wǎng)站鏈接搜索引擎
1. Elasticsearch 是什么?有哪些應(yīng)用場(chǎng)景? Elasticsearch 整體原理流程?
Elasticsearch 是一個(gè)為海量數(shù)據(jù)提供近實(shí)時(shí)搜索和分析能力的分布式搜索引擎,廣泛應(yīng)用于全文檢索、日志分析和大數(shù)據(jù)處理場(chǎng)景中。
Elasticsearch 整體原理流程:
1.建索引(Index)與定義 Mapping:建索引,相當(dāng)于創(chuàng)建一個(gè)邏輯的數(shù)據(jù)容器,用于存放文檔。Mapping,定義索引中字段的數(shù)據(jù)類型、分詞器、是否索引等屬性,類似數(shù)據(jù)庫的 schema。通過 mapping,ES 知道如何解析和存儲(chǔ)每個(gè)字段的數(shù)據(jù),如何分詞建立倒排索引。
2. 插入文檔(Document):用戶提交 JSON 格式的文檔,寫入到指定的索引中。ES 根據(jù) mapping 解析字段,對(duì)需要分詞的字段進(jìn)行分詞處理(Tokenizer + Token Filters),生成詞項(xiàng)(tokens)。對(duì)每個(gè)詞項(xiàng)建立倒排索引,記錄詞項(xiàng)在哪些文檔中出現(xiàn),以及出現(xiàn)頻率、位置等信息。文檔數(shù)據(jù)會(huì)被存儲(chǔ)在主分片(Primary Shard)及其副本分片(Replica Shard)中,保證數(shù)據(jù)高可用。寫操作異步刷新到磁盤,提高寫入性能。
3. 查詢流程:查詢請(qǐng)求發(fā)到集群的某個(gè)節(jié)點(diǎn)(協(xié)調(diào)節(jié)點(diǎn))。協(xié)調(diào)節(jié)點(diǎn)根據(jù)索引的分片信息,將查詢請(qǐng)求廣播到所有相關(guān)的主分片和副本分片。對(duì)查詢語句進(jìn)行解析,針對(duì)查詢字段使用對(duì)應(yīng)的分詞器分詞(如 match 查詢)。在倒排索引中查找詞項(xiàng),快速定位匹配文檔 ID。計(jì)算文檔相關(guān)度得分(基于 TF-IDF 或 BM25 算法等),排序。各分片返回結(jié)果給協(xié)調(diào)節(jié)點(diǎn)。協(xié)調(diào)節(jié)點(diǎn)合并各分片結(jié)果,進(jìn)行排序分頁,返回最終結(jié)果給客戶端。
2. 倒排索引是什么?為什么適合全文檢索?
在理解倒排索引之前,先看一下正排索引。正排索引是從“文檔到詞”的映射,也就是說:每個(gè)文檔記錄了它包含的所有詞。而倒排索引則是相反的:它是從“詞到文檔”的映射,即:每個(gè)詞會(huì)記錄它出現(xiàn)在哪些文檔中。
當(dāng)我們搜索一個(gè)詞時(shí),只需通過倒排索引快速定位所有包含該詞的文檔,而不需要對(duì)所有文檔內(nèi)容進(jìn)行全文掃描,大大提升了搜索性能。此外,倒排索引還可以記錄每個(gè)詞在各個(gè)文檔中出現(xiàn)的頻率、位置等信息,用于相關(guān)性打分(如 BM25 算法),從而實(shí)現(xiàn)搜索結(jié)果的排序和精準(zhǔn)匹配。因此,倒排索引非常適合實(shí)現(xiàn)高性能的全文搜索,是搜索引擎(如 Elasticsearch)核心的數(shù)據(jù)結(jié)構(gòu)之一。
3. ES 中的文檔(Document)、索引(Index)、類型(Type)是什么?
在 Elasticsearch 中,最基本的數(shù)據(jù)單位是 Document(文檔),它就像數(shù)據(jù)庫中的一行數(shù)據(jù),JSON 格式存儲(chǔ)。
文檔是存在哪個(gè) Index(索引) 里的,索引可以類比為數(shù)據(jù)庫或表,是文檔的邏輯集合。
早期 ES 中還支持 Type(類型),一個(gè) Index 下可以有多個(gè) Type,相當(dāng)于一個(gè)數(shù)據(jù)庫里有多個(gè)表。但因?yàn)榈讓咏Y(jié)構(gòu)沖突,從 6.x 開始被逐步廢棄,7.x 開始每個(gè)索引只能有一個(gè) Type,8.x 完全移除。
所以現(xiàn)在實(shí)際開發(fā)中,一個(gè)索引通常只存一種類型的文檔,不再使用 Type。
比如我們項(xiàng)目中有商品搜索功能,就會(huì)創(chuàng)建一個(gè) product_index
,每條商品數(shù)據(jù)就是一個(gè)文檔,包含商品名、描述、價(jià)格等字段,然后通過這個(gè)索引來實(shí)現(xiàn)搜索和過濾。
4. 什么是 Mapping?和數(shù)據(jù)庫中的 schema 有什么區(qū)別?
在 Elasticsearch 中,索引(Index)通過 Mapping 來定義文檔結(jié)構(gòu),包括字段名、字段類型、是否索引、是否分詞等規(guī)則,相當(dāng)于定義表的結(jié)構(gòu)。
PUT /products
{"mappings": {"properties": {"name": { "type": "text", "analyzer": "standard" },"price": { "type": "float" },"in_stock": { "type": "boolean" },"created_at": { "type": "date" }}}
}
文檔(Document)是索引中的一條具體數(shù)據(jù)記錄,以 JSON 格式存儲(chǔ),結(jié)構(gòu)要符合 Mapping 的定義。
POST /products/_doc/1
{"name": "Apple iPhone 14","price": 799.99,"in_stock": true,"created_at": "2024-06-01T10:00:00Z"
}
所以可以理解為:Mapping 決定了索引中能存什么樣的數(shù)據(jù)結(jié)構(gòu),文檔就是實(shí)際存進(jìn)去的數(shù)據(jù)。
在 Elasticsearch 中,Mapping 類似于數(shù)據(jù)庫中的 Schema,它定義了每個(gè)文檔字段的數(shù)據(jù)類型、是否分詞、是否索引、分詞器、是否支持聚合等規(guī)則。
不同于數(shù)據(jù)庫,ES 的 Mapping 更加靈活,比如可以支持嵌套結(jié)構(gòu)、數(shù)組、動(dòng)態(tài)字段,還能定義全文檢索相關(guān)的分詞方式,是搜索性能調(diào)優(yōu)的重要部分。
5. ES 中 match
和 term
查詢的區(qū)別?
在 Elasticsearch 中,match 查詢是 全文檢索 類型的查詢,它會(huì)對(duì)查詢條件先進(jìn)行分詞,然后再去倒排索引中查找對(duì)應(yīng)的文檔,常用于搜索 text 類型字段,比如商品描述、文章內(nèi)容等。
term 查詢則是 精確匹配 查詢,它不會(huì)進(jìn)行分詞,直接使用給定的值去匹配字段,常用于 keyword、數(shù)值、布爾值等字段的過濾或精確判斷。
所以兩者的核心區(qū)別就是:match 會(huì)分詞,適合模糊查詢;term 不分詞,適合精確查詢。
6. ES 是怎么進(jìn)行分詞的?常用的分詞器有哪些?
Elasticsearch 使用 分詞器(Analyzer) 來對(duì)文本字段進(jìn)行處理,分詞器會(huì)將一段文本拆分為一個(gè)個(gè)詞項(xiàng)(term)并進(jìn)行標(biāo)準(zhǔn)化,例如大小寫轉(zhuǎn)換、去除符號(hào)、刪除停用詞等。
分詞器一般包含三個(gè)組件:
1.字符過濾器(Char Filters):預(yù)處理文本,如去除 HTML 標(biāo)簽。
2.分詞器(Tokenizer):將文本切分成詞(最核心部分)。
3.詞項(xiàng)過濾器(Token Filters):對(duì)分詞結(jié)果進(jìn)行加工,比如大小寫統(tǒng)一、去除停用詞、同義詞處理等。
常用分詞器:
1.standard:默認(rèn)分詞器,按空格、標(biāo)點(diǎn)分詞,同時(shí)做大小寫標(biāo)準(zhǔn)化
輸入: I'm learning Elasticsearch.
輸出:i, m, learning, elasticsearch
2.simple:以非字母字符為分隔符,只保留小寫英文
輸入: Hello, World!
輸出: hello, world
3.whitespace:僅以空格分詞,不做其他處理
輸入: Hello, World!
輸出: hello, world
4.keyword:不分詞,把整個(gè)輸入當(dāng)成一個(gè)詞項(xiàng)
輸入: 中華人民共和國
輸出: 中華人民共和國
5.ik_max_word:中文分詞器,細(xì)粒度,盡可能多的切詞
輸入: 中國互聯(lián)網(wǎng)公司
輸出: 中國, 互聯(lián)網(wǎng), 公司, 中國互聯(lián)網(wǎng), 互聯(lián)網(wǎng)公司
6.ik_smart:中文分詞器,粗粒度,分得較少但準(zhǔn)確
輸入: 中國互聯(lián)網(wǎng)公司
輸出: 中國互聯(lián)網(wǎng), 公司
7. 什么是主分片(Primary Shard)和副本分片(Replica Shard)?
在 Elasticsearch 中,索引的數(shù)據(jù)是通過主分片和副本分片進(jìn)行分布式存儲(chǔ)的。
主分片(Primary Shard)負(fù)責(zé)實(shí)際寫入和保存原始數(shù)據(jù);副本分片(Replica Shard)是主分片的冗余副本,用于容災(zāi)備份和查詢負(fù)載均衡。
通常每個(gè)主分片至少配置一個(gè)副本,從而保證當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)時(shí)數(shù)據(jù)不會(huì)丟失,并且查詢時(shí)可以由多個(gè)分片并行處理提升性能。
主分片負(fù)責(zé)寫入,副本分片負(fù)責(zé)高可用和查詢負(fù)載分擔(dān);主分片掛了,副本可以自動(dòng)轉(zhuǎn)為主分片,保障數(shù)據(jù)可靠性。
8. ES 是如何保證高可用的?節(jié)點(diǎn)掛掉會(huì)怎樣?
Elasticsearch 通過主/副分片機(jī)制、Master 選舉機(jī)制以及自動(dòng)分片遷移能力實(shí)現(xiàn)高可用。
當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)時(shí),集群會(huì)自動(dòng)將其主分片由副本接管,并在其他節(jié)點(diǎn)上重新構(gòu)建副本,從而實(shí)現(xiàn)無縫切換,保證查詢和寫入的連續(xù)性。同時(shí),Master 節(jié)點(diǎn)也有選舉機(jī)制,避免單點(diǎn)故障,整個(gè)集群能自動(dòng)感知變化并自我修復(fù)。
節(jié)點(diǎn)掛掉會(huì)發(fā)生什么?
Elasticsearch 會(huì)立刻識(shí)別失聯(lián)節(jié)點(diǎn)(默認(rèn) 30 秒內(nèi))。
該節(jié)點(diǎn)上的主分片如果有副本,副本會(huì)自動(dòng)被提升為主分片。
副本不足的部分,會(huì)被自動(dòng)重新分配到其他節(jié)點(diǎn)上重建副本。
查詢和寫入請(qǐng)求會(huì)自動(dòng)路由到新的主分片或其副本,不會(huì)影響業(yè)務(wù)使用。
如果主節(jié)點(diǎn)宕機(jī),會(huì)觸發(fā)主節(jié)點(diǎn)重新選舉機(jī)制,集群會(huì)暫時(shí)處于 yellow 狀態(tài),自動(dòng)恢復(fù)后變回 green。
9. 怎么保證 ES 和數(shù)據(jù)庫之間的數(shù)據(jù)一致性?
保證 ES 和數(shù)據(jù)庫之間數(shù)據(jù)一致,關(guān)鍵在于解決異步同步導(dǎo)致的最終一致性問題:
1. 冪等寫入
ES 寫入接口要設(shè)計(jì)冪等,避免重復(fù)寫入產(chǎn)生臟數(shù)據(jù)。
常用 document id 由業(yè)務(wù)唯一主鍵生成。
2. 異步消息可靠傳遞
使用消息隊(duì)列保障消息不丟失(持久化、確認(rèn)機(jī)制)。
設(shè)計(jì)消息重試機(jī)制,處理寫 ES 失敗。
3. 事務(wù)保證與補(bǔ)償機(jī)制
有條件的場(chǎng)景使用分布式事務(wù)(如基于消息中間件的事務(wù)模式)。
定時(shí)全量校驗(yàn)比對(duì),發(fā)現(xiàn)不一致后自動(dòng)修復(fù)。
4. 順序消費(fèi)
保證消息順序消費(fèi),避免舊數(shù)據(jù)覆蓋新數(shù)據(jù)。
5. 監(jiān)控和告警
監(jiān)控同步延遲和失敗率,及時(shí)人工干預(yù)。
10. 實(shí)際項(xiàng)目中一般數(shù)據(jù)是怎么同步到 ES 的?
1. 應(yīng)用程序主動(dòng)寫入(同步寫入)
在業(yè)務(wù)系統(tǒng)(如數(shù)據(jù)庫)寫操作后,直接調(diào)用 Elasticsearch API 進(jìn)行索引寫入。
2. 異步同步(消息隊(duì)列/日志異步消費(fèi))
業(yè)務(wù)系統(tǒng)將數(shù)據(jù)變更事件發(fā)送到消息隊(duì)列(Kafka、RabbitMQ 等)。專門的同步服務(wù)監(jiān)聽消息隊(duì)列,異步寫入 Elasticsearch。
3. 定時(shí)全量同步 + 增量同步
定時(shí)全量同步是指周期性(比如每天凌晨)將數(shù)據(jù)庫中的所有數(shù)據(jù)一次性批量導(dǎo)入 Elasticsearch。目的是初始化數(shù)據(jù)或修復(fù)數(shù)據(jù)不一致問題。
增量同步是指只同步自上次同步后數(shù)據(jù)庫中新增加或變更的數(shù)據(jù)??梢酝ㄟ^基于業(yè)務(wù)表的時(shí)間戳字段(如 update_time
)進(jìn)行差量查詢;使用數(shù)據(jù)庫變更日志(binlog)捕獲變更事件;監(jiān)聽消息隊(duì)列中實(shí)時(shí)數(shù)據(jù)變更事件來實(shí)現(xiàn)增量同步。