【基礎篇】第3章 索引與文檔操作

在Elasticsearch的世界里,索引是存儲數據的地方,文檔則是索引中的基本單位,包含具體的數據信息。本章將深入探討索引和文檔操作的基礎,從創建到管理,為高效數據處理奠定基礎。

3.1 索引概念與創建

3.1.1 索引、類型與文檔簡介

  • 索引:類似于傳統數據庫中的數據庫,用于存儲具有相似特征的數據集合。每個索引都有唯一的名稱,并且可以被分配到多個分片上。
  • 類型:在Elasticsearch 7.x之后,類型已經被棄用,建議將所有文檔存儲在單一類型 _doc 下,以簡化數據模型。
  • 文檔:是索引中的基本單位,相當于數據庫中的行記錄。文檔是以JSON格式存儲的數據對象,每個文檔都有一個唯一的標識符(_id)。

3.1.2 創建、刪除與修改索引

  • 創建索引
    通過發送一個PUT請求到http://localhost:9200/{index_name},可以創建一個新的索引。例如,創建名為my_index的索引:

    curl -X PUT "localhost:9200/my_index?pretty"
    
  • 刪除索引
    使用DELETE請求到相應索引的URL即可刪除索引,如:

    curl -X DELETE "localhost:9200/my_index?pretty"
    
  • 修改索引
    修改索引通常涉及更新索引的設置或映射。使用PUT請求加上特定的API,如更新索引設置:

    curl -X PUT "localhost:9200/my_index/_settings?pretty" -H 'Content-Type: application/json' -d'
    {"index": {"number_of_replicas": 2}
    }'
    

3.2 文檔 CRUD

3.2.1 創建文檔

通過POST或PUT方法添加文檔至索引中。例如,向my_index索引添加一個文檔:

curl -X POST "localhost:9200/my_index/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{"title": "Elasticsearch入門","author": "張三","content": "這是關于Elasticsearch的第一篇文章。"
}'

3.2.2 讀取文檔

GET請求可以用來獲取指定ID的文檔:

curl -X GET "localhost:9200/my_index/_doc/1?pretty"

3.2.3 更新文檔

文檔更新實際上是對原文檔的替換操作。可以通過POST或PUT請求實現,使用版本控制確保并發安全:

curl -X POST "localhost:9200/my_index/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{"doc": {"content": "這是更新后的內容,加入了新的信息。"}
}'

3.2.4 刪除文檔

DELETE請求可以刪除指定ID的文檔:

curl -X DELETE "localhost:9200/my_index/_doc/1?pretty"

3.2.5 批量操作

批量操作是Elasticsearch中一項重要的性能優化手段,它允許你在一個請求中執行多個索引、更新、刪除操作,顯著提高了處理大量數據時的效率。本節將深入探討批量操作的細節,包括批量操作的格式、優勢、最佳實踐以及如何有效利用批量API進行高效的數據處理:

curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/x-ndjson' -d'
{ "index" : { "_index" : "my_index", "_id" : "2" } }
{ "title" : "深入Elasticsearch", "author" : "李四", "content" : "探索Elasticsearch的高級特性。" }
{ "delete" : { "_index" : "my_index", "_id" : "1" } }
'
批量操作格式

批量操作使用_bulk API,接受一種特殊的NDJSON(Newline Delimited JSON)格式輸入,其中每個操作由兩行組成:一行是操作元數據,另一行是實際的數據文檔。操作元數據包括操作類型(如indexcreateupdatedelete)和可選的元數據,如_id和_version。

示例:

{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_id" : "2" } }
{ "field1" : "value2" }
{ "delete" : { "_index" : "test", "_id" : "3" } }
批量操作的優勢
  1. 減少網絡開銷:相較于單個操作,批量處理減少了客戶端與服務器之間的往返次數,顯著提升了處理速度。
  2. 提升吞吐量:Elasticsearch能夠并行處理批量中的多個請求,特別是在處理大量小文檔時,效率提升尤為明顯。
  3. 原子性:盡管批量操作是一系列操作的組合,但Elasticsearch保證了批量內的所有操作要么全部成功,要么全部失敗,提供了事務性的保障。
  4. 靈活的數據導入:適用于數據遷移、日志收集、定時任務等場景,能夠高效地導入大量數據。
最佳實踐
  1. 平衡批量大小:批量大小不是越大越好。過大的批量會消耗更多的內存和CPU資源,增加處理時間,甚至導致節點響應緩慢或失敗。推薦根據實際應用和硬件性能進行測試,找到最優的批量大小。
  2. 監控與調整:使用Elasticsearch的監控工具(如_cat APIs、Kibana的監控面板)跟蹤批量操作的性能,如響應時間和錯誤率,根據反饋調整策略。
  3. 錯誤處理:批量操作響應中包含了每個操作的執行狀態,包括成功或失敗的具體原因。應用層應解析這些信息,對失敗操作進行重試或記錄。
  4. 索引刷新策略:批量導入大量數據時,可以通過設置refresh_interval-1暫停索引的自動刷新,待導入完畢后再手動刷新,以進一步提升導入速度。
批量操作的高級用法
  • 腳本更新:在批量更新操作中,可以直接嵌入Painless腳本,實現復雜的業務邏輯處理,無需單獨查詢再更新。
  • 版本控制:批量操作支持樂觀鎖并發控制,通過指定文檔的_version字段,可以防止并發更新導致的數據不一致。
  • 回執處理:使用refresh參數可以在批量操作后立即刷新索引,使得新數據立即可見;使用wait_for_active_shards確保操作在指定數量的分片活躍時才執行,增強數據安全性。

3.3 映射管理

映射管理是Elasticsearch數據建模的關鍵環節,它直接影響到數據的存儲效率、查詢性能及結果準確性。本節將深入解析映射的概念、動態與靜態映射的配置方法,以及如何有效地管理與更新映射,以適應數據模型的變化。

3.3.1 映射概述

映射(Mapping)是Elasticsearch中定義索引如何存儲文檔的一種方式,它描述了文檔中每個字段的數據類型、分析器設置、是否存儲原始值等屬性。映射不僅決定了如何解析和索引字段,也影響著查詢性能和結果排序。

3.3.2 動態映射

自動識別與創建

Elasticsearch默認啟用動態映射,這意味著當你首次索引一個文檔時,如果文檔中的字段沒有在映射中預先定義,Elasticsearch會自動檢測字段類型并創建相應的映射。這一特性極大地簡化了初始數據導入的過程,但也可能導致映射過于靈活,缺乏統一性。

動態映射控制

盡管動態映射方便,但有時需要限制其行為以保持數據的一致性和優化存儲。通過設置dynamic參數為truefalsestrict,可以分別允許自動映射、禁止任何自動映射,或僅允許已知字段的映射自動更新。

3.3.3 靜態映射

手動定義

靜態映射是指在創建索引之前或之后明確地定義好所有字段的映射規則。這包括指定字段的數據類型(如textinteger)、是否分析(analyzed或not_analyzed)、是否存儲原始值(store)等。

curl -X PUT "localhost:9200/my_index/_mapping?pretty" -H 'Content-Type: application/json' -d'
{"properties": {"title": { "type": "text" },"author": { "type": "keyword" }}
}'

優勢與局限

靜態映射的優勢在于提供了對數據模型的嚴格控制,有助于保持數據一致性,減少存儲空間的浪費,并優化查詢性能。然而,它要求在索引初期就對數據結構有較深的理解,且在數據模式發生變化時,需要手動調整映射,增加了維護成本。

3.3.4 映射更新策略

漸進式映射

Elasticsearch支持漸進式的映射更新,允許在索引生命周期中添加新字段或改變字段的某些屬性,如分析器設置。但是,核心字段類型(如從text改為integer)的變更通常不被支持,因為這可能導致數據丟失或索引不一致。

更新方法

映射更新通常通過PUT請求到索引的_mapping API來完成。例如,為my_index索引添加一個新的字段映射:

curl -X PUT "localhost:9200/my_index/_mapping" -H 'Content-Type: application/json' -d'
{"properties": {"new_field": { "type": "date" }}
}'

注意事項

  • 更新映射可能引起索引重新打開,對查詢性能有短暫影響。
  • 對于大規模生產環境,映射更新應謹慎進行,避免對在線服務造成影響。
  • 使用PUT更新映射時,若已有字段的映射與請求中不一致,可能會導致錯誤,除非使用ignore_conflicts參數。
3.3.5 映射最佳實踐
  • 前期規劃:盡可能在索引創建前明確映射,減少后期修改映射的需求。
  • 動態映射控制:根據數據特點,合理設置動態映射的策略,避免不必要的字段自動創建。
  • 定期審查:隨著數據模式的演進,定期審查映射,確保其符合當前數據需求,優化存儲和查詢性能。
  • 備份映射:在進行重大映射更改前,備份當前映射,以便于回滾或參考。

通過細致的映射管理,不僅可以提升Elasticsearch的性能,還能確保數據的準確性和一致性,為復雜的數據查詢和分析提供堅實的基礎。

小結

本章涵蓋了Elasticsearch中索引與文檔操作的核心知識點,從基礎的索引創建到文檔的CRUD操作,再到映射的管理,為數據的存儲和檢索奠定了基礎。掌握了這些基本技能,你將能夠有效管理Elasticsearch中的數據。下一章《第4章 查詢與過濾》,將深入探討如何高效地從Elasticsearch中檢索數據,包括使用各種查詢語法和過濾條件來精準定位所需信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37502.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch之nn.Module與nn.functional用法區別

文章目錄 1. nn.Module2. nn.functional2.1 基本用法2.2 常用函數 3. nn.Module 與 nn.functional3.1 主要區別3.2 具體樣例:nn.ReLU() 與 F.relu() 參考資料 1. nn.Module 在PyTorch中,nn.Module 類扮演著核心角色,它是構建任何自定義神經網…

【Spring Boot 源碼學習】初識 ConfigurableEnvironment

《Spring Boot 源碼學習系列》 初識 ConfigurableEnvironment 一、引言二、主要內容2.1 Environment2.1.1 配置文件(profiles)2.1.2 屬性(properties) 2.2 ConfigurablePropertyResolver2.2.1 屬性類型轉換配置2.2.2 占位符配置2.…

wxss和css有什么區別?

WXSS(WeiXin Style Sheets)和CSS(Cascading Style Sheets)在功能和應用上有很多相似之處,但針對微信小程序的特殊需求,WXSS對CSS進行了一些擴展和修改。以下是WXSS和CSS之間的主要區別: 尺寸單…

Mybatis實現流程

一&#xff0c;UserDAO 接口定義 首先&#xff0c;定義 UserDAO接口&#xff0c;包含 getList()方法,定義類型為List<User>&#xff1a; package dao;import model.User; import java.util.List;public interface UserDAO {List<User> getList(); }二&#xff0c…

Python--進程基礎

創建進程 os.fork() 該方法只能在linux和mac os中使用&#xff0c;因為其主要基于系統的fork來實現。window中沒有這個方法。 通過os.fork()方法會創建一個子進程&#xff0c;子進程的程序集為該語句下方的所有語句。 import os??print("主進程的PID為:" , os.g…

Python pdfkit wkhtmltopdf html轉換pdf 黑體字體亂碼

wkhtmltopdf 黑體在html轉換pdf時&#xff0c;黑體亂碼&#xff0c;分析可能wkhtmltopdf對黑體字體不太兼容&#xff1b; 1.html內容如下 <html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> </head&…

DreamView數據流

DreamView數據流 查看DV中界面啟動dag&#xff0c;/apollo/modules/dreamview_plus/conf/hmi_modes/pnc.pb.txt可以看到點擊界面的planning按鈕&#xff0c;后臺其實啟動的是/apollo/modules/planning/planning_component/dag/planning.dag和/apollo/modules/external_command…

語音識別應用Python示例

語音識別是將語音信號轉換為文本的技術&#xff0c;是人工智能領域的重要研究方向之一。下面是一個基于Python的簡單語音識別應用的代碼示例。 首先&#xff0c;需要安裝Python的語音識別庫SpeechRecognition。可以使用以下命令進行安裝&#xff1a; pip install SpeechRecog…

版本號比較

版本號比較&#xff1a; 注意&#xff1a; 不可以直接使用字符串比較的方法進行版本號比較。例如 2.29.1 > 2.3.0 是 false 的 版本號比較可以參考以下代碼&#xff1a; function compareVersion(v1, v2) {v1 v1.split(.)v2 v2.split(.)const len Math.max(v1.length, …

Oracle連接mysql

oracle使用的11g&#xff0c;在一臺windows服務器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一臺windows服務器&#xff0c;這兩個服務器之間的網絡是互通的。做BI時&#xff0c;要獲取不同數據源的數據&#xff0c;這些數據源可能是Oracle&#xff0c;也可能是sqlserv…

springboot基礎入門2(profile應用)

Profile應用 一、何為Profile二、profile配置方式1.多profile文件方式2.yml多文檔方式 三、加載順序1. file:./config/: 當前項目下的/config目錄下2. file:./ &#xff1a;當前項目的根目錄3. classpath:/config/:classpath的/config目錄4. classpath:/ : classpath的根目錄 四…

【設計模式】【創建型5-2】【工廠方法模式】

文章目錄 工廠方法模式工廠方法模式的結構示例產品接口具體產品工廠接口具體工廠客戶端代碼 實際的使用 工廠方法模式 工廠方法模式的結構 產品&#xff08;Product&#xff09;&#xff1a;定義工廠方法所創建的對象的接口。 具體產品&#xff08;ConcreteProduct&#xff0…

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式雖然提高了系統的可用性&#xff0c;但是真正存儲數據的還是主節點和從節點&#xff0c;并且每個節點都存儲了全量的數據&#xff0c;此時&#xff0c;如果數據量過大&#xff0c;接近或超出了 主節點 / 從節點機器的物理內存&#xff0c;就…

個人網站制作 Part 28 添加用戶活動跟蹤功能 | Web開發項目添加頁面緩存

文章目錄 &#x1f469;?&#x1f4bb; 基礎Web開發練手項目系列&#xff1a;個人網站制作&#x1f680; 添加用戶活動跟蹤功能&#x1f528;使用分析工具&#x1f527;步驟 1: 選擇分析工具&#x1f527;步驟 2: 注冊Google Analytics賬戶&#x1f527;步驟 3: 獲取Analytics…

Java面試題--JVM大廠篇之深入了解G1 GC:高并發、響應時間敏感應用的最佳選擇

引言&#xff1a; 在現代Java應用的性能優化中&#xff0c;垃圾回收器&#xff08;GC&#xff09;的選擇至關重要。對于高并發、響應時間敏感的應用而言&#xff0c;G1 GC&#xff08;Garbage-First Garbage Collector&#xff09;無疑是一個強大的工具。本文將深入探討G1 GC適…

李一桐遭遇蜈蚣驚魂

李一桐遭遇“蜈蚣驚魂”&#xff01;劉宇寧展現真男人本色在娛樂圈的幕后&#xff0c;總有一些心跳加速的驚險。近日&#xff0c;李一桐在拍戲時遭遇了一場“蜈蚣驚魂”&#xff0c;讓無數粉絲和網友為她捏了一把冷汗。而在這場驚險的遭遇中&#xff0c;劉宇寧展現出了真男人的…

NOI大綱——普及組——二叉搜索樹

二叉搜索樹 二叉搜索樹&#xff08;Binary Search Tree&#xff0c;簡稱BST&#xff09;是一種特殊的二叉樹&#xff0c;它具有以下幾個特點&#xff1a; 節點的左子樹上的所有節點的值都小于或等于該節點的值。節點的右子樹上的所有節點的值都大于或等于該節點的值。每個節點…

ActiveMq工具之管理頁面說明

文章目錄 安裝ActiveMQ一: 訪問管理頁面二: 進入管理頁面&#xff0c;主頁三: Queues頁說明四: Topics頁說明五: Subscribers頁說明 安裝ActiveMQ wget https://archive.apache.org/dist//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz wget https://mirrors.huaweiclou…

為什么越來越多的企業選擇外包?賦能企業未來

軟件開發過程包括設計需求、設計方案、產品研發、產品交付、后期維護&#xff0c;許多企業并沒有軟件開發的專業能力與工作經驗&#xff0c;將軟件開發工作進行外包是比較節約成本的&#xff0c;企業能少走不少彎路。 YesPMP平臺&#xff08;一站式軟件外包、項目外包服務-YesP…

UWA Pipeline 2.6.1版本更新

UWA Pipeline是專為游戲開發團隊設計的本地協作平臺&#xff0c;旨在幫助團隊建立專業的DevOps研發交付流水線。本平臺提供了可視化的CI/CD操作界面&#xff0c;高可用的自動化測試和無縫集成的UWA性能保障服務等核心功能。 在最新的Pipeline更新中&#xff0c;UWA引入了參數配…