ES(Elasticsearch) 基本概念(一)

Elasticsearch作為當前最流行的開源搜索和分析引擎,廣泛應用于日志分析、全文搜索、業務智能等領域。Elasticsearch是一個基于 Apache Lucene 構建的分布式搜索和分析引擎、可擴展數據存儲和矢量數據庫。它針對生產級工作負載的速度和相關性進行了優化。使用 Elasticsearch 可以近乎實時地搜索、索引、存儲和分析各種類型和大小的數據。Kibana是 Elasticsearch 的圖形用戶界面。它是一款強大的工具,可用于可視化和分析數據,以及管理和監控 Elastic Stack。本文將帶你系統學習Elasticsearch的核心概念和基本用法。

一、Elasticsearch基礎概念

在開始實際操作前,我們需要了解幾個核心概念:

  1. 文檔(Document)
    1. ES是面向文檔的,文檔是所有可搜索數據的最小單元
    2. 文檔會被序列化成JSON格式存儲
    3. 每個文檔都有唯一ID,可自定義或自動生成
    4. 支持數組和嵌套結構
  2. 索引(Index)
    1. 相當于MySQL中的數據庫
    2. 名稱必須全部小寫
    3. 包含mapping(定義字段類型)和setting(定義數據分布)
  3. 節點(Node)與分片(Shard)
    1. 節點:是 一個ES實例,本質是一個Java進程
      1. Master Eligible節點:參與選主,管理集群狀態
      2. Data節點:存儲數據
      3. Coordinating節點:接收客戶端請求
      4. 節點的名稱可以通過配置文件配置,或者在啟動的時候使用-E node.name=ropledata指定,默認是隨機分配的。建議咱們自己指定,因為節點名稱對于管理目的很重要,咱們可以通過節點名稱確定網絡中的哪些服務器對應于ES集群中的哪些節點;
    2. 分片:將索引水平拆分為多個部分
      1. 主分片數在創建索引時指定,后續不能修改
      2. 副本分片提供高可用性,可動態調整數量
  4. 類型:就相當于MySql里的表,我們知道MySql里一個庫下可以有很多表,最原始的時候ES也是這樣,一個索引下可以有很多類型,但是從6.0版本開始,type已經被逐漸廢棄,但是這時候一個索引仍然可以設置多個類型,一直到7.0版本開始,一個索引就只能創建一個類型了(_doc)。 Elasticsearch7 去掉 tpye 概念ES7.x 版本:URL 中的 type 參數為可選。 ES8.x 版本:不?持 URL 中的 type 參數

注意:雖然在實際存儲上,文檔存在于某個索引里,但是文檔必須被賦予一個索引下的

二、什么是倒排索引?

倒排索引(Inverted Index)是搜索引擎最核心的數據結構,也是Elasticsearch實現高效全文搜索的基礎。它與我們熟悉的傳統"正排索引"形成鮮明對比:

  • 正排索引(正向索引):文檔文檔(Document)
    • ES是面向文檔的,文檔是所有可搜索數據的最小單元
    • 文檔會被序列化成JSON格式存儲
    • 每個文檔都有唯一ID,可自定義或自動生成
    • 支持數組和嵌套結構
  • 索引(Index)
    • 相當于MySQL中的數據庫
    • 名稱必須全部小寫
    • 包含mapping(定義字段類型)和setting(定義數據分布)
  • 節點(Node)與分片(Shard)
    • 節點:一個ES實例,本質是一個Java進程
      • Master Eligible節點:參與選主,管理集群狀態
      • Data節點:存儲數據
      • Coordinating節點:接收客戶端請求
    • 分片:將索引水平拆分為多個部分
      • 主分片數在創建索引時指定,后續不能修改
      • 副本分片提供高可用性,可動態調整數量
  • → 包含的詞
    • 類似書籍的目錄,通過章節找內容
    • 如:文檔1包含"大話"、"西游"
  • 倒排索引(反向索引):詞 → 出現的文檔
    • 類似書籍的索引頁,通過關鍵詞找章節
    • 如:"西游" → 文檔1、文檔2、文檔3...

三、倒排索引的構建過程

3.1 原始數據示例

以電影片名為例:

文檔ID

電影名稱

1

大話西游

2

大話西游外傳

3

解析大話西游

4

西游降魔外傳

5

夢幻西游獨家解析

3.2 分詞處理

中文需要先進行分詞(使用分詞器將句子拆分為詞語):

  • "大話西游" → ["大話", "西游"]
  • "大話西游外傳" → ["大話", "西游", "外傳"]
  • "解析大話西游" → ["解析", "大話", "西游"]
  • "西游降魔外傳" → ["西游", "降魔", "外傳"]
  • "夢幻西游獨家解析" → ["夢幻", "西游", "獨家", "解析"]

3.3 構建倒排列表

對分詞結果進行反向記錄:

詞項

文檔ID列表(Posting List)

其他信息(如詞頻、位置等)

西游

1,2,3,4,5

在1中出現1次,在2中出現1次...

大話

1,2,3

在1中出現1次,在2中出現1次...

外傳

2,4

在2中出現1次,在4中出現1次...

解析

3,5

在3中出現1次,在5中出現1次...

降魔

4

在4中出現1次

夢幻

5

在5中出現1次

獨家

5

在5中出現1次

三、倒排索引的搜索過程

3.1 搜索示例:查詢"獨家大話西游"

  1. 查詢分詞
    1. "獨家大話西游" → ["獨家", "大話", "西游"]
  2. 查找倒排列表
    1. "獨家" → 文檔5
    2. "大話" → 文檔1,2,3
    3. "西游" → 文檔1,2,3,4,5
  3. 合并結果
    1. 文檔1:包含"大話"、"西游"
    2. 文檔2:包含"大話"、"西游"
    3. 文檔3:包含"大話"、"西游"
    4. 文檔5:包含"獨家"、"西游"
    5. 文檔4:只包含"西游"

相關性評分(簡化版)

評分公式:

得分 = 命中詞數 / 文檔總詞數

    1. 文檔1:命中2詞("大話"、"西游"),總詞數2 → 2/2=1.0

    2. 文檔2:命中2詞,總詞數3 → 2/3≈0.67

    3. 文檔3:命中2詞,總詞數3 → 2/3≈0.67

    4. 文檔5:命中2詞("獨家"、"西游"),總詞數4 → 2/4=0.5

    5. 文檔4:命中1詞("西游"),總詞數3 → 1/3≈0.33

結果排序

1. 大話西游 (1.0)
2. 大話西游外傳 (0.67)
3. 解析大話西游 (0.67)
4. 夢幻西游獨家解析 (0.5)
5. 西游降魔外傳 (0.33)

基礎操作

索引管理?

// 創建索引
PUT /ropledata
{"settings": {"number_of_shards": "2","number_of_replicas": "3"}
}// 刪除索引
DELETE /ropledata// 修改副本數
PUT ropledata/_settings
{"number_of_replicas": "2"
}

什么是映射?

映射(Mapping)是ElasticSearch中用于定義文檔及其包含字段如何存儲和索引的機制。它相當于關系型數據庫中的表結構定義,決定了:

  1. 哪些字段應該被當作全文檢索字段
  2. 哪些字段包含數字、日期或地理位置信息
  3. 日期值的格式
  4. 自定義規則來控制動態添加字段的映射

映射的核心作用

  1. 字段類型定義:指定每個字段的數據類型(如text、keyword、integer等)
  2. 索引控制:決定字段是否被索引(可搜索)
  3. 分析器配置:指定文本字段使用的分詞器
  4. 格式設置:如日期字段的格式
  5. 多字段支持:一個字段可以有不同的索引方式

映射類型

1. 顯式映射

級屬性映射?

用戶明確定義字段的映射規則:

PUT /my-index
{"mappings": {"properties": {"age":    { "type": "integer" },  "email":  { "type": "keyword" },"name":   { "type": "text" }}}
}

多級屬性映射?

PUT /my-index
{"mappings": {"properties": {"age": { "type": "integer" },"email": { "type": "keyword" },"name": { "type": "text" },"address": {"type": "nested","properties": {"street": { "type": "text" },"city": { "type": "keyword" },"zipcode": { "type": "keyword" },"coordinates": {"type": "object","properties": {"lat": { "type": "float" },"lon": { "type": "float" }}}}},"skills": {"type": "nested","properties": {"name": { "type": "keyword" },"level": { "type": "integer" },"certifications": {"type": "nested","properties": {"name": { "type": "text" },"year": { "type": "short" }}}}},"employment_history": {"type": "nested","properties": {"company": { "type": "keyword" },"position": { "type": "text" },"duration_months": { "type": "integer" }}}}}
}

這個映射定義包含:

  1. 基本字段:age(integer), email(keyword), name(text)
  2. 嵌套地址對象:包含街道(text)、城市(keyword)、郵編(keyword)和坐標對象
  3. 嵌套技能數組:包含技能名(keyword)、等級(integer)和嵌套的認證數組
  4. 嵌套工作經歷數組:包含公司(keyword)、職位(text)和持續時間(integer)

所有嵌套關系都使用?"type": "nested"?來確保數組中的對象被獨立索引和查詢。

2. 動態映射

當索引新文檔時,ES會自動檢測并添加新字段:

PUT /my-index/_doc/1
{"age": 25,"email": "user@example.com","name": "John Doe"
}

ES會自動推斷:

age → long

email → keyword

name → text

常用字段類型

類型

說明

text

全文檢索字段,會被分詞

keyword

精確值字段,不分析,用于過濾、排序和聚合

long/integer

長整型/整型數值

double/float

雙精度/單精度浮點數

date

日期類型,可指定格式

boolean

布爾值

object

JSON對象

nested

嵌套對象,保持數組中對象的獨立性

geo_point

經緯度坐標

映射操作示例

查看映射

GET /my-index/_mapping

添加新字段映射

PUT /my-index/_mapping
{"properties": {"employee-id": {"type": "keyword","index": false}}
}

更新映射注意事項

重要:已存在字段的映射類型不能直接修改,必須:

  1. 創建新索引并定義新映射
  2. 使用_reindex API遷移數據
POST _reindex
{"source": { "index": "old-index" },"dest": { "index": "new-index" }
}

映射參數詳解

常用參數

  1. index:是否索引該字段(true/false)
  2. analyzer:指定文本分析器
  3. search_analyzer:指定搜索時分析器
  4. format:日期格式(如"yyyy-MM-dd")
  5. copy_to:將字段值復制到目標字段
  6. fields:多字段特性,允許一個字段有多種索引方式

多字段示例

{"mappings": {"properties": {"city": {"type": "text","fields": {"raw": { "type": "keyword"}}}}}
}

這樣city可以用于全文搜索,city.raw可用于精確匹配和聚合。

索引數據

  1. 預先定義映射:生產環境建議預先定義映射,避免動態映射的不確定性
  2. 合理使用keyword:不需要分詞的字段應設為keyword類型
  3. 控制動態映射:可通過dynamic參數控制(true/false/strict)
  4. 避免頻繁修改:映射特別是字段類型不宜頻繁變更
  5. 使用別名:便于重建索引時無縫切換映射是ElasticSearch高效工作的基礎,合理的映射設計能顯著提升搜索性能和結果的準確性。

一、數據插入操作

1. 不指定文檔ID插入

Elasticsearch 會自動生成唯一ID

POST /ropledata/_doc/
{"id":1,"name":"且聽_風吟","page":"https://ropledata.blog.csdn.net","say":"歡迎點贊,收藏,關注,一起學習"
}

2. 指定文檔ID插入

適用于需要自定義ID的場景

POST /ropledata/_doc/101
{"id":1,"name":"且聽_風吟","page":"https://ropledata.blog.csdn.net","say":"歡迎點贊,收藏,關注,一起學習"
}

二、數據刪除操作

刪除指定ID的文檔:

DELETE /ropledata/_doc/101

三、數據更新操作

1. 全局更新(覆蓋更新)

會完全替換原有文檔內容

PUT /ropledata/_doc/101
{"id":1,"name":"且聽_風吟","page":"https://ropledata.blog.csdn.net","say":"再次歡迎點贊,收藏,關注,一起學習"
}

2. 局部更新

只更新指定字段,性能優于全局更新

POST /ropledata/_update/101
{"doc": {"say":"奧力給"}
}

四、數據查詢操作

1. 基礎查詢(默認返回10條)

GET /ropledata/_search

2. 帶條件的全局查詢

POST /ropledata/_search
{"query": {"match_all": {}},"sort": [{"id": {"order": "asc"}}]
}

五、索引重建操作

POST _reindex
{"source": { "index": "twitter" },"dest": { "index": "new_twitter" }
}

關鍵知識點總結

  1. 插入數據
    1. 不指定ID時ES自動生成
    2. 指定ID適用于業務關聯場景
  2. 更新機制
    1. ES文檔不可變,更新實質是新版本覆蓋舊版本
    2. 局部更新(_update)比全局更新(PUT)性能更好
  3. 查詢特點
    1. 默認返回10條結果
    2. 可通過sort參數控制排序
    3. match_all查詢全部文檔
  4. 版本兼容性
    1. 本文示例適用于Elasticsearch 7.x版本
    2. 6.x及以下版本語法可能有差異
  5. 性能建議
    1. 頻繁更新的字段考慮單獨索引
    2. 大文檔更新優先使用局部更新

提示:在實際開發中,建議結合業務場景選擇合適的操作方式,批量操作(Bulk API)能顯著提高大批量數據處理的效率。

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

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

相關文章

當物聯網“芯”闖入納米世界:ESP32-S3驅動的原子力顯微鏡能走多遠?

上次咱們把OV2640攝像頭“盤”得明明白白,是不是感覺ESP32-S3這小東西潛力無限?今天,咱們玩個更刺激的,一個聽起來就讓人腎上腺素飆升的挑戰——嘗試用ESP32-S3這顆“智慧芯”,去捅一捅科學界的“馬蜂窩”,…

Excel合并單元格后,如何自動批量生成序號列

1.選擇整列 2.組合鍵:CtrlG 3.定位條件,選擇“空值” 4.在第一個框中輸入“MAX(”,鼠標選中A1框,后加“:”,鼠標選中前方“A1”,按“F4”絕對引用,補全右括號,后輸入“1…

TDengine 運維—容量規劃

概述 若計劃使用 TDengine 搭建一個時序數據平臺,須提前對計算資源、存儲資源和網絡資源進行詳細規劃,以確保滿足業務場景的需求。通常 TDengine 會運行多個進程,包括 taosd、taosadapter、taoskeeper、taos-explorer 和 taosx。 在這些進程…

Axure設計數字鄉村可視化大屏:從布局到交互的實戰經驗分享

鄉村治理正從傳統模式向“數據驅動”轉型。數字鄉村可視化大屏作為數據展示的核心載體,不僅能直觀呈現鄉村發展全貌,還能為決策提供科學依據。本文以Axure為工具,結合實際案例,分享如何從零設計一個功能完備、交互流暢的數字鄉村大…

從零基礎到最佳實踐:Vue.js 系列(1/10):《環境搭建與基礎概念》

Vue.js 環境搭建與基礎概念 關鍵點 Vue.js 是一個簡單易用的前端框架,適合初學者快速上手。搭建開發環境需要安裝 Node.js 和 npm/Yarn,推薦使用最新 LTS 版本。Vue CLI 是官方工具,可快速創建項目并提供開發服務器。Vue.js 基于 MVVM 模式&…

使用docker compose部署dify(大模型開發使用平臺)

Dify是一款生成式 AI 應用中間件,面向有私有部署與數據合規需求的企業用戶,推動企業向 AI 時代轉型。平臺支持無代碼構建,業務人員即可快速搭建與調試 AI 應用,顯著降低開發門檻。 參考 https://docs.dify.ai/zh-hans/getting-s…

npm 安裝時 SSL 證書過期問題筆記

問題描述: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired 這表明當前配置的 npm 鏡像源(淘寶鏡像 https://registry.npm.taobao.org&…

力扣HOT100之二叉樹: 236. 二叉樹的最近公共祖先

果然,這道題二刷還是不會做,回去看卡爾視頻了。結合靈神的題解,我對這道題有了一些新的理解。 首先這道題還是用遞歸來做,由于我們需要計算兩個節點的最近公共祖先,一定是從下往上來遍歷,只有先判斷左右子樹…

Word 轉 HTML API 接口

Word 轉 HTML API 接口 圖像/轉換 Word 文檔轉換為 HTML 文件轉換 / 超高精度與還原度 文件轉換 / Word。 1. 產品功能 超高精度與還原度的 HTML 文件轉換;支持將 Word 文檔轉換為 HTML 格式;支持 .doc 和 .docx 格式;保持原始 Word 文檔的…

idea 安裝飛算-javaAI 插件使用

文章目錄 前言idea 安裝飛算-javaAI 插件使用1. 介紹一下飛算-AI2. 安裝使用 前言 如果您覺得有用的話,記得給博主點個贊,評論,收藏一鍵三連啊,寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差,實在白嫖的…

Bert預訓練任務-MLM/NSP

MLM MLM:Masked Language Mode:在每一個訓練序列中以15%的概率隨機地選中某個token進行MASK,當一個token被選中后,有以下三種處理方式: 80%的概率被[MASK],如my dog is hairy->my dog is [MASK]10%的概率修改為隨機的其他token,如my dog …

瀏覽器原生 Web Crypto API 實現 SHA256 Hash 加密

寫在前面 在我上一篇文章 《node 后端和瀏覽器前端,有關 RSA 非對稱加密的完整實踐, 前后端匹配的代碼演示》 中,我們使用 瀏覽器原生 Web Crypto API 實現了 RSA 的加密算法。 但是,在我之前的 《我設計的一個安全的 web 系統用…

5G 網絡尋呼的信令及 IE 信息分析

一、尋呼信令的觸發背景 在 5G 網絡中,當網絡側有下行數據要發送給處于空閑態(RRC_IDLE)或非激活態(RRC_INACTIVE)的用戶設備(UE)時,就會觸發尋呼流程。這是因為在這些狀態下,UE 與網絡之間沒有建立持續的無線資源控制(RRC)連接,網絡需要通過尋呼機制來通知 UE 有…

印度語言指令驅動的無人機導航!UAV-VLN:端到端視覺語言導航助力無人機自主飛行

作者:Pranav Saxena, Nishant Raghuvanshi and Neena Goveas單位:比爾拉理工學院(戈瓦校區)論文標題:UAV-VLN: End-to-End Vision Language guided Navigation for UAVs論文鏈接:https://arxiv.org/pdf/250…

基于Zynq SDK的LWIP UDP組播開發實戰指南

一、為什么選擇LWIP組播? 在工業控制、智能安防、物聯網等領域,一對多的高效數據傳輸需求日益增長。Zynq-7000系列SoC憑借其ARM+FPGA的獨特架構,結合LWIP輕量級網絡協議棧,成為嵌入式網絡開發的理想選擇。本文將帶您實現: LWIP組播配置全流程動態組播組切換技術零拷貝數據…

(三)MMA(KeyCloak身份服務器/OutBox Pattern)

文章目錄 項目地址一、KeyCloak二、OutBox Pattern2.1 配置Common模塊的OutBox1. OutboxMessage2. 數據庫配置OutboxMessageConfiguration3. 創建Save前的EF攔截器4. 創建Quartz后臺任務5. 配置后臺任務6. 注冊服務2.2 創建OutBox的消費者1. 自定義IDomainEventHandler2. 定義抽…

初步認識HarmonyOS NEXT端云一體化開發

視頻課程學習報名入口:HarmonyOS NEXT端云一體化開發 1、課程設計理念 本課程采用"四維能力成長模型"設計理念,通過“能看懂→能聽懂→能上手→能實戰”的漸進式學習路徑,幫助零基礎開發者實現從理論認知到商業級應用開發的跨越。該模型將學習過程劃分為四個維度…

Vue百日學習計劃Day43-45天詳細計劃-Gemini版

Day 43: Composable 函數基礎與抽取簡單邏輯 (~3 小時) 本日目標: 理解 Composable 函數的概念、優勢,并學會如何將簡單的、無狀態的邏輯抽取為 Composable。所需資源: Vue 3 官方文檔 (組合式函數): https://cn.vuejs.org/guide/reusability/composables.html 學…

C++:list容器,deque容器

list容器&#xff1a;雙向鏈表容器&#xff0c;底層是雙向鏈表。 簡單使用如下&#xff1a; #include<iostream> #include<list> using namespace std;int main() {list<int> lst;lst.push_back(1);lst.push_back(2);lst.push_back(3);lst.push_front(4);l…

STM32之溫濕度傳感器(DHT11)

KEIL軟件實現printf格式化輸出 一般在標準C庫是提供了格式化輸出和格式化輸入等函數&#xff0c;用戶想要使用該接口&#xff0c;則需要包含頭文件 #include &#xff0c;由于printf函數以及scanf函數是向標準輸出以及標準輸入中進行輸出與輸入&#xff0c;標準輸出一般指的是…