1、Elasticsearch 是什么?它與傳統數據庫有什么區別?
答案:Elasticsearch 是一個基于 Lucene 的分布式、開源的搜索和分析引擎,主要用于處理大量的文本數據,提供快速的搜索和分析功能。與傳統數據庫相比,ES 更側重于全文搜索和實時數據分析,數據以 JSON 格式存儲,具有更好的擴展性和靈活性,而傳統數據庫擅長事務處理和結構化數據的存儲與查詢。
2、什么是倒排索引?它是如何工作的?
答案:倒排索引是 Elasticsearch 的核心數據結構。它從詞出發,記載了每個詞在哪些文檔中出現過,由詞典和倒排表組成。在構建倒排索引時,會對文檔進行分詞處理,將文檔拆分成詞條,然后建立詞條與文檔 ID 的映射關系。查詢時,通過查找詞條在倒排索引中的位置,快速定位到包含該詞條的文檔。
3、Elasticsearch 中的索引、文檔和字段分別是什么?
答案:索引類似于關系數據庫中的數據庫,是具有相同結構的文檔的集合;文檔是 ES 中最小的存儲單位,相當于關系數據庫中的一條記錄,以 JSON 格式存儲;字段是文檔中的屬性,類似于關系數據庫中的列,每個字段都有其數據類型。
4、如何理解 Elasticsearch 中的分片和副本?
答案:分片是為了提高 ES 的存儲和查詢性能,將索引分成多個部分,分布在不同的節點上。副本是每個分片的備份,用于提高可用性和容錯性,當主分片出現故障時,副本可以替代主分片提供服務。合理設置分片和副本數量可以平衡系統的性能、可用性和成本。
5、Elasticsearch 是如何實現 Master 選舉的?
答案:前置前提是只有候選主節點(master:true)的節點才能成為主節點,并且要滿足最小主節點數(min_master_nodes)以防止腦裂。選舉流程大致為:第一步,確認候選主節點數達標,即滿足 elasticsearch.yml 設置的 discovery.zen.minimum_master_nodes 的值;第二步,比較節點,先判定是否具備 master 資格,具備候選主節點資格的優先返回;若兩節點都為候選主節點,則 id 小的值會成為主節點,這里的 id 為 string 類型。
6、詳細描述一下 Elasticsearch 索引文檔的過程。
答案:第一步,客戶端向集群中的某節點寫入數據,發送請求,如果沒有指定路由 / 協調節點,請求的節點扮演路由節點的角色;第二步,節點接收到請求后,使用文檔_id 來確定文檔屬于哪個分片,請求會被轉到對應的主分片所在節點;第三步,主分片所在節點在主分片上執行寫操作,如果成功,則將請求并行轉發到其他副本分片上,等待結果返回。所有的副本分片都報告成功后,主分片所在節點將向協調節點報告成功,協調節點再向請求客戶端報告寫入成功。
7、Elasticsearch 的查詢流程是怎樣的?
答案:首先,客戶端發送搜索請求,請求中包含查詢條件、索引名稱等信息。Elasticsearch 根據搜索請求中指定的索引名稱和查詢條件,確定哪些分片包含符合查詢條件的文檔數據,然后并行地向這些分片發送搜索請求,每個分片在本地執行相應的查詢操作并返回部分結果。接著,Elasticsearch 將這些部分結果匯總起來,并根據查詢要求對結果進行排序,最后將搜索結果返回給客戶端。
8、在 Elasticsearch 中,如何進行索引數據的調優?
答案:可以從設計階段、寫入階段、查詢階段等方面進行調優。設計階段,根據業務增量需求,采取基于日期模板創建索引,使用別名進行索引管理,合理設置分詞器,充分考慮字段屬性等;寫入階段,寫入前可將副本數設置為 0,關閉 refresh_interval,寫入過程中采用 bulk 批量寫入,寫入后恢復副本數和刷新間隔,盡量使用自動生成的 id;查詢階段,禁用 wildcard 和批量 terms,充分利用倒排索引機制,能使用 keyword 類型盡量使用 keyword,數據量大時先基于時間敲定索引再檢索,設置合理的路由機制等。
9、什么是 Elasticsearch 中的 Mapping?它有什么作用?
答案:Mapping 定義了文檔的結構,包括字段的數據類型、索引方式、分析器等信息。它的作用是告訴 Elasticsearch 如何解析和存儲文檔中的數據,以及如何對字段進行索引和搜索,確保數據能夠被正確地處理和查詢。
10、Elasticsearch 支持哪些數據類型?
答案:常見的數據類型有文本類型(text)、關鍵字類型(keyword)、日期類型(date)、數值類型(如 integer、long、float、double 等)、布爾類型(boolean),還有二進制類型(binary)、地理空間類型(geo - point、geo - shape)等。