如何顯示一個 Elasticsearch 索引的字段

作者:來自 Elastic?JD Armada

學習如何使用 _mapping 和 _search API、子字段、合成 _source 和運行時字段來顯示 Elasticsearch 索引的字段。

更多閱讀:

  1. Elasticsearch:從搜索中獲取選定的字段 fields

  2. Elasticsearch:inverted index,doc_values 及 source

  3. Observability:Elasticsearch 新的索引 mode: Logsdb 初體驗

想獲得 Elastic 認證嗎?了解下一次 Elasticsearch Engineer 培訓的時間!

Elasticsearch 擁有眾多新功能,幫助你為你的使用場景構建最佳搜索解決方案。瀏覽我們的示例 notebooks 了解更多,開始免費 cloud 試用,或在本地機器上體驗 Elastic。


本文將討論如何顯示 Elasticsearch 索引的字段。這有助于了解你的數據結構,識別特定字段,以及排查問題。我們將涵蓋以下主題:

  1. 使用 _mapping API 獲取字段信息
  2. 使用 _search API 顯示字段值
  3. 顯示子字段
  4. 合成 _source
  5. 運行時字段

1)使用 _mapping API 獲取字段信息

_mapping API 允許你獲取一個或多個索引的映射定義。這包括字段、它們的數據類型以及其他屬性的信息。要獲取特定索引的映射,請使用以下請求:

GET /<index_name>/_mapping

例如,如果你有一個名為 my_index 的索引,可以使用以下請求來獲取它的映射:

GET /my_index/_mapping

響應將包含該索引的映射定義,其中包含字段及其屬性的信息。

你也可以獲取某個特定字段的映射。當映射較大且你只關注某個字段時,這會很有用。要獲取特定字段的映射,請使用以下請求:

GET /my_index/_mapping/field/my_field

你也可以通過用逗號分隔字段名來獲取多個字段的映射,如下所示的請求:

GET /my_index/_mapping/field/my_field_1,my_field_2,my_field_3

2)使用 _search API 顯示字段值

要顯示 Elasticsearch 索引中字段的值,可以使用 _search API。_search API 提供多種方式來控制返回哪些字段,主要有以下兩種:

  1. _source:_source 字段包含索引時的原始 JSON 文檔正文,包括通過攝取管道或預處理步驟所做的任何更改。要從源文檔中顯示特定字段,可以使用源過濾(source filtering),我們將在下文介紹。
  2. fields:fields 參數允許你在搜索時根據索引映射檢索文檔中的特定字段。與 _source 不同,fields 可以返回存儲字段(stored fields)、doc values 或運行時字段(runtime fields)的值,而無需引用 _source。不過,對于沒有 doc values 或存儲設置的標準字段,fields 會回退使用 _source。這樣可以帶來性能等多方面的優勢,我們將在下文看到。

使用 _source 字段

默認情況下,_search API 會返回 _source 字段,它包含被索引的原始 JSON 文檔。要顯示特定字段,你可以在搜索請求中使用 _source 參數添加過濾器,這稱為源過濾(source filtering)。

以下是一個搜索請求示例,用于返回 my_index 索引中文檔的 title 和 author 字段的值:

GET /my_index/_search
{"query": {"match_all": {}},"_source": ["title", "author"]
}

在這個例子中,_source 參數指定了要返回的字段。

如果你需要更細致的控制,可以使用 _source 對象的 includes 和 excludes 屬性。例如,下面的查詢返回頂層的 title 字段和 author 的所有子字段,但排除 author.description。

GET /my_index/_search
{"query": {"match_all": {}},"_source": {“includes”: [“title”, “author.*],“excludes”: [“author.description”]}
}

在這個例子中,我們使用 author.* 模式來獲取 author 對象的所有直接子字段。然后顯式排除 author.description,這樣只返回其他 author 字段。注意,這不會提升性能,因為仍需加載和解析源 JSON,但可以減少通過網絡傳輸的響應大小。

使用 fields 參數

你可以使用 fields 參數過濾搜索響應中返回的字段。相比 _source,使用 fields 有以下幾個好處:

  • 性能提升:fields 可以直接從存儲字段(stored fields)或 doc values 返回值,無需加載完整的 _source,減小響應負載大小。

  • 格式化輸出:對于標準字段,fields 可能回退到 _source 獲取值,但會參考索引映射正確格式化輸出,比如格式化日期,使其與聚合和排序中使用的格式一致。

  • 訪問運行時字段:fields 可以返回運行時字段,這些字段在原始 _source 中不存在。

  • 更多好處可以參考相關文檔。

例如,要僅返回 my_index 索引中的 title 和 author 字段,可以使用以下搜索請求:

GET /my_index/_search
{"query": {"match_all": {}},"fields": ["title", "author"],"_source": false
}

在上面的查詢中,我們將 _source 字段設置為 false,這樣就不返回源文檔。這可以大幅減少響應的負載大小,但請注意,這僅因為字段 title 和 author 是 keyword 類型,且默認啟用了 doc_values。如果字段未啟用 doc_values 且 _source 設置為 false,Elasticsearch 無法檢索這些字段,它們會在響應中被跳過。

需要注意的是,fields 響應總是返回每個字段的值數組,即使該字段只有一個值。這是因為 Elasticsearch 沒有專門的數組類型,任何字段都可能有多個值。關于 Elasticsearch 中數組的更多信息,請點擊這里。

其他獲取字段的方法

雖然推薦使用 _source 或 fields 來獲取字段,但也有其他方法適用于特定場景,例如:

Doc value 字段:如果你想完全避免使用 _source,可以使用 docvalue_fields 參數進行搜索。Doc values 存儲與 _source 相同的字段值,但采用的是磁盤上的數據結構,優化了排序和聚合。

因為它獨立于 _source 存儲的值,你可以請求特定字段而無需加載整個 _source。對于查詢大文檔但只需要少數字段且這些字段支持 doc values 的情況,這很有用。另一個使用 docvalue_fields 的場景是對日期和數值字段使用自定義格式化,如下面示例所示。

請注意,這只適用于你啟用了 doc_values 的字段或默認啟用 doc_values 的字段類型,如 keyword、date、numeric 和 boolean,不適用于 text 或 annotated_text。

在這個例子中,我們使用 docvalue_fields 參數來檢索 title、author 和 published 字段,而不加載完整的 _source 文檔:

GET /my_index/_search
{"query": {"match_all": {}},"docvalue_fields": ["title","author",{"field": "published","format": "epoch_millis"}],"_source": false
}

當這個查詢執行時,Elasticsearch 會直接從其磁盤上的列式存儲中獲取值,而不是引用每個文檔的 _source。由于查詢中提供了 format 參數,published 字段以 epoch_millis 格式返回,而不是默認格式。

存儲字段(Stored fields):如果你在映射中顯式將某些字段標記為 stored,可以使用 stored_fields 參數過濾這些字段。當你只想要輕量響應,僅包含這些特定字段,或想檢索你故意存儲的字段時,這很有用。存儲字段獨立于 _source,因此這種方法也適合避免加載 _source。

需要注意的是,這個選項默認是關閉的,且通常不推薦使用。建議使用源過濾(source filtering)來返回原始源文檔的某些子集。

在下面的示例查詢中,我們使用 stored_fields 參數來檢索 summary 字段,該字段的索引映射配置為 "store": true。

GET /my_index/_search
{"query": {"match_all": {}},"stored_fields": ["summary"]
}

當這個查詢執行時,Elasticsearch 會檢查該字段是否標記了 "store": true,如果沒有找到,則會完全跳過該字段。

顯示子字段

如果你的索引包含子字段,可以在 fields 參數中使用點號表示法指定字段路徑。注意,子字段不同于 nested 字段類型。例如,如果你有一個名為 address.city 的子字段,可以這樣包含在搜索響應中:

GET /my_index/_search
{"query": {"match_all": {}},"fields": ["title", "author", "address.city"],"_source": false
}

在這個例子中,搜索響應將包含 title、author 和 address.city 字段的值。

合成 _source

如果你想保留使用 _source 的功能,同時節省磁盤空間,可以在索引映射中使用合成 _source。合成 _source 是一個功能,允許 Elasticsearch 根據已有的數據(如存儲字段和 doc values)重建 _source,即使 _source 被禁用。這能節省大量存儲空間,但查詢時需要即時重建,速度會稍慢。你可以在索引設置中使用以下配置來啟用此功能:

PUT idx
{"settings": {"index": {"mapping": {"source": {"mode": "synthetic"}}}}
}

使用合成 _source 的一些好處包括:在使用 _search API 時可以完整顯示文檔,支持源過濾,并兼容像 Kibana 這樣期望 _source 可用的其他功能和工具,同時避免存儲完整的 _source 文檔。

運行時字段

運行時字段(Runtime fields)允許你在查詢時或索引映射的 runtime 塊中定義腳本字段。這些字段不會被索引,因此添加運行時字段不會增加索引大小,但也不會出現在 _source 中。映射中定義的運行時字段是持久的,所有查詢都可用;查詢時定義的運行時字段是臨時的,僅在該次搜索請求中可用。

使用運行時字段的主要好處是能夠在數據已被攝取后添加字段,簡化映射設計。運行時字段也適合用腳本生成原始文檔中不存在的值,比如格式化字符串或計算分數。

但需要注意,運行時字段會影響性能,因為每個結果文檔都需要運行腳本。你也可以通過 _search API 的 fields 參數來檢索運行時字段。

總結

顯示 Elasticsearch 索引的字段可以從簡單地使用索引映射或 _source 獲取值,到更高級地使用 fields、docvalue_fields 或運行時字段,以獲得更高的控制和效率。理解不同方法的權衡對優化搜索體驗非常關鍵。無論是優化響應負載,豐富文檔內容,還是使用合成 _source 節省存儲,Elasticsearch 都提供了多種工具和功能,幫助你以所需方式找到所需數據。這些技術能幫助你理解數據結構,識別特定字段,并排查問題。

原文:How to display fields of an Elasticsearch index - Elasticsearch Labs

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

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

相關文章

vue3父組件把一個對象整體傳入子組件,還是把一個對象的多個屬性分成多個參數傳入

以一個對象整體傳入時&#xff0c;對象的定義&#xff1a;<template><div><p>姓名: {{ userInfo.name }}</p><p>年齡: {{ userInfo.age }}</p><p>郵箱: {{ userInfo.email }}</p></div> </template> <script s…

【unitrix數間混合計算】2.1 數間混合計算模塊(src/number/mod.rs)

一、源碼 這段代碼是一個Rust模塊的聲明和導出配置&#xff0c;主要用于實現"類型級數與基本類型混合計算"的功能。 //! 類型級數與基本類型混合計算// 模塊聲明 // -------------------------------- mod types; // 結構體定義 mod normalize; …

脫機部署k3s

離線部署 K3s 文檔 1. 準備工作 操作系統準備&#xff1a;確保服務器已安裝好基礎操作系統&#xff08;Ubuntu、CentOS 等&#xff09;。關閉防火墻或放通端口&#xff1a;建議關閉防火墻或確保 6443、10250 等端口已開放。準備離線資源文件&#xff1a; 下載地址 k3s-airga…

[失敗記錄] 使用HBuilderX創建的uniapp vue3項目添加tailwindcss3的完整過程

寫在前面 放棄了。。。 1&#xff09;方案1 - 參考下面的“完整步驟” - 安裝成功&#xff0c;運行成功&#xff0c;但是&#xff01;好多class不生效&#xff01; 2&#xff09;方案2 - 不安裝tailwindcss&#xff0c;直接使用獨立的編譯好的完整css文件&#xff01; …

使用Idea去git項目,發現拉取和推送都很慢的問題

在大多數情況下&#xff0c;用Idea去對項目進行拉取和推送是很方便的&#xff0c;對于新手來說也是非常友好的但是最近博主遇到了一個問題&#xff0c;就是我feat一個簡單的類&#xff0c;去提交推送都需要很長的時間&#xff0c;甚至是20分鐘&#xff0c;博主去找了很多方法。…

無人機圖傳的得力助手:5G 便攜式多卡高清視頻融合終端的協同應用

前言在無人機作業中&#xff0c;圖傳系統是連接空中與地面的關鍵紐帶&#xff0c;而 5G 便攜式多卡高清視頻融合終端雖不直接搭載于無人機&#xff0c;卻能通過地面協同突破傳統微波圖傳的局限&#xff0c;為無人機遠程監控、應急指揮提供穩定高效的傳輸支撐。型號&#xff1a;…

【博客系統UI自動化測試報告】

博客系統UI自動化測試報告一、項目背景二、測試內容(一)測試用例(二)測試賬號(三&#xff09;使用Selenium進行Web自動化測試1.環境搭建2.創建瀏覽器驅動3.編寫博客登陸模塊的測試用例代碼4.編寫博客主頁展示模塊的測試用例代碼5.編寫博客創作模塊的測試用例代碼6.編寫博客查看…

簡單手寫Transformer:原理與代碼詳解

Transformer 作為 NLP 領域的里程碑模型&#xff0c;徹底改變了序列建模的方式。它基于自注意力機制&#xff0c;擺脫了 RNN 的序列依賴&#xff0c;實現了并行計算&#xff0c;在機器翻譯、文本生成等任務中表現卓越。本文將從零開始&#xff0c;手寫一個簡化版 Transformer&a…

Numpy科學計算與數據分析:Numpy入門之數組操作與科學計算基礎

Numpy入門實踐&#xff1a;從零開始掌握科學計算利器 學習目標 通過本課程的學習&#xff0c;學員將了解Numpy的歷史背景、核心特點及其在科學計算中的重要性。學員將掌握如何使用Numpy進行數組操作&#xff0c;包括數組的創建、索引、切片以及基本的數學運算&#xff0c;為后…

python:講懂決策樹,為理解隨機森林算法做準備,以示例帶學習,通俗易懂,容易理解和掌握

為什么要講和學習決策樹呢?主要是決策樹(包括隨機森林算法)不需要數據的預處理。現實世界的數據往往“臟亂差”,決策樹讓你在數據準備上可以少花很多功夫,快速上手,用起來非常的“省心”。總之,決策樹是機器學習領域里最直觀易懂、解釋性最強、應用最廣泛的基礎模型之一…

C語言:單鏈表學習

文件&#xff1a;main.c #include "linkedList.h"int main(int argc, char *argv[]) {// 創建頭結點NODE *head NULL;// 創建鏈表if (llist_create(&head, 666) < 0){perror("鏈表創建失敗&#xff01;");return -1;}// 向鏈表插入數據llist_addTa…

使用 decimal 包解決 go float 浮點數運算失真

文章目錄問題解決注意問題 go float 在運算的時候會出現精度問題 package mainimport ("fmt" )func main() {var a float64 0.3var b float64 0.6fmt.Println("ab", ab) // 你以為是 0.9 但是結果是&#xff1a;0.8999999999999999 }你觀察到的 0.3 …

MongoDB學習專題(六)復制集和分片集群

1、概念MongoDB復制集的主要意義在于實現服務高可用&#xff0c;類似于Redis中的哨兵模式2、功能1. 數據寫入主節點時將數據復制到另一個副本節點上2. 主節點發生故障時自動選舉出一個新的替代節點在實現高可用的同時&#xff0c;復制集實現了其他幾個作用數據分發&#xff1a;…

vue3對比vue2的性能優化和提升 :Vue 3 vs Vue 2

1.性能提升 1.1.響應式系統的改進: 從 Object.defineProperty 到 Proxy Vue2:Vue 2 的響應式系統基于 Object.defineProperty,它為每個屬性單獨設置 getter 和 setter。雖然能夠滿足基本需求,但它在以下方面存在性能瓶頸: Vue2 中數組監聽的局限性:Vue2 通過Object.defi…

進程生命周期管理:從創建到終止的完整邏輯

前言 在操作系統的世界里&#xff0c;進程就像一個個忙碌的 “工作單元”&#xff0c;從被創建到完成任務后終止&#xff0c;始終遵循著一套嚴謹的生命周期規則。理解進程的生命周期管理&#xff0c;是揭開操作系統多任務調度神秘面紗的關鍵 —— 而這其中&#xff0c;進程的創…

【顯示器】背光板的結構和工作原理

背光板是LCD&#xff08;液晶顯示器&#xff09;中的一個重要組件&#xff0c;它負責提供屏幕所需的光源。下面我們詳細解釋背光板的結構和工作原理。背光板的基本結構一個典型的背光板由以下幾個主要部分組成&#xff1a;LED燈條&#xff1a;通常使用白色LED作為光源。導光板&…

hadoop HDFS 重置詳細步驟

有時候我們需要對hdfs重置&#xff0c;步驟如下&#xff1a; 1、停止服務 2. 清除日志節點ssh dmp-hdfs-ns1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-ns2 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt2 rm -rf /disk1/dfs/jn/me…

前端性能優化:從請求到資源的精細調控

在用戶體驗為王的時代&#xff0c;前端性能直接決定產品的留存率。本文聚焦 “減少不必要的傳輸與加載損耗”&#xff0c;從 合并HTTP請求、啟用壓縮、減少Cookie、資源加載順序 四個維度&#xff0c;拆解優化思路與落地方法。 一、合并HTTP請求&#xff1a;突破瀏覽器并發瓶頸…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博輿情數據可視化分析-熱詞情感趨勢柱狀圖

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博輿情數據可視化分析-熱詞情感趨勢柱狀圖…

腳本統計MongoDB集合結構信息

場景&#xff1a; 當想統計mongodb集合的結構是什么數據類型時。 1.利用variety.js解析 https://github.com/variety/variety 2.腳本 #!/bin/bash#userxxx #passwxxx host1xx.1x.1x.150 port27010 dbhgrtabs$(echo "show collections"|mongo ${host}:${port}/${db}|g…