ElasticSearch之映射常用操作

来源:https://www.cnblogs.com/ytao-blog/archive/2020/03/20/12530805.html
-Advertisement-
Play Games

Mapping (映射)類似關係型資料庫中的表的結構定義。我們將數據以 JSON 格式存入到 ElasticSearch 中後,在搜索引擎中 JSON 欄位映射對應的類型,這時需要 mapping 來定義內容的類型。 ...


本文案例操作,建議先閱讀我之前的文章《ElasticSearch之安裝及基本操作API》

Mapping (映射)類似關係型資料庫中的表的結構定義。我們將數據以 JSON 格式存入到 ElasticSearch 中後,在搜索引擎中 JSON 欄位映射對應的類型,這時需要 mapping 來定義內容的類型。

欄位類型

JSON 數據類型映射到 ElasticSearch 定義的類型,常用的簡單類型有:

JSON類型 ElasticSearch 類型
文本類型 Text/Keyword
整數類型 long/integer
浮點類型 float/double
時間類型 date
布爾值 boolean
數組 Text/Keyword

上面要註意的是時間類型,JSON 中並沒有時間類型,這裡主要指時間格式數據的類型。

定義映射

在關係型資料庫中,存儲數據之前,我們會先創建表結構,給欄位指定一個存在的類型。同樣 ElasticSearch 在進行數據存儲前,也可以先定義好存儲數據的 Mapping 結構。
先定義一個簡單的 person Mapping:

上圖中就是一個 Mapping 的定義,如果是在 ElasticSearch7 之前,mappings 里還有 _type 屬性。

動態映射

當沒有事先定義好 Mapping,添加數據時,ElasticSearch 會自動根據欄位進行換算出對應的類型,但是換算出來的類型並不一定是我們想要的欄位類型,還是需要人為的干預進行修改成想要的 Mapping。

更新映射

使用 dynamic 控制映射是否可以被更新。

dynamic-true

設置 dynamic 為true是預設 dynamic 的預設值,新增欄位數據可以寫入,同時也可以被索引,Mapping 結構也會被更新。

添加數據,同時多添加一個沒被定義的 gender 欄位。

# 向 person 中添加數據
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "廣東省珠海市",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true,
  "gender": "男"    # Mapping 中未定義的欄位
}

添加成功,搜索 gender 欄位:

查看 Mapping 結構:

新添加的欄位值,在添加過程中 Mapping 已自動添加欄位。

dynamic-false

設置 dynamic 為false時,新增欄位數據可以寫入,不可以被索引,Mapping 結構會被更新。
同樣先將 dynamic 設置為 false,然後向裡面添加數據,其他步驟和上面 true 操作一樣。定義 Mapping,添加數據。
搜索 gender 欄位:

此時新增欄位數據無法被索引,但數據可以寫入。

Mappnig 也不會添加新增的欄位:

dynamic-strict

設置 dynamic 為strict時,從字面上意思也可以看出,對於動態映射是較嚴格的,新增欄位數據不可以寫入,不可以被索引,Mapping 結構不會被更新。只能按照定義好的 Mapping 結構添加數據。
在添加新欄位數據時,就馬上會拋出異常:

自動識別日期類型

上文中,當 dynamic 設置為 true 時,添加新欄位數據自動識別類型更新 Mapping,如果是日期類型的話,我們是可以指定識別的類型。
指定 person 的 dynamic_date_formats 格式:

PUT person/_mapping
{
  "dynamic_date_formats": ["yyyy/MM/dd"]
}

這裡是可以指定多個時間格式。
向 person 添加新數據,分別是 today 和 firstDate:

PUT person/_doc/2
{
  "today": "2020-01-15",
  "firstDate": "2020/01/15"
}

添加新欄位數據後的 Mapping:

由於上面我們指定了時間格式為 yyyy/MM/dd 時是可以識別為時間格式,所以 today 欄位的值為 yyyy-MM-dd 格式無法識別為時間類型,判為 text 類型。

多欄位

Mapping 中可以定義 fields 多欄位屬性,以滿足不同場景下的實現。比如 address 定義為 text 類型,fields 裡面又有定義 keyword 類型,這裡主要是區分兩個不同不同使用場景。

  • text 會建立分詞倒排索引,用於全文檢索。
  • keyword 不會建立分詞倒排索引,用於排序和聚合。

添加數據:

# 向 person 中添加數據
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "廣東省珠海市",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true
}

查詢address數據。

查詢address.keyword數據。

通過keyword檢索時,由於不會建立分詞索引,並沒有獲取到數據。

控制索引

在欄位中使用 index 指定當前欄位索引是否能被搜索到。指定類型為 boolean 類型,false 為不可搜索到,true 為可以搜索到。
先刪除之前的 Mapping:

DELETE person

創建 Mapping,設置name屬性的 index 為 false。

再次添加上面的數據後搜索name欄位:

欄位 index 設置 false 後,由於沒有被索引,所以搜索無法獲取到索引。

空值處理

現在向 ElasticSearch 中添加一條 address 為空的數據:

PUT person/_doc/2
{
  "uId": 2,
  "name": "Jack",
  "age": 22,
  "address": null,
  "birthday": "2020-01-15T12:00:00Z",
  "money": 68.7,
  "isStrong": true
}

搜索 address.keyword 為空的數據:

搜索返回異常,預設是不被允許搜索 NUll。
這是需要在 Mapping 指定 null_value 屬性,並且不能在text類型中聲明。

搜索 address.keyword 為空的數據:

設置 "null_value": "NULL" 後,空值可以處理搜索。

聚合多個欄位

聚合多個欄位放到一個索引中,使用 copy_to 進行聚合。例如我們在多欄位查詢中,這是不需要對每個欄位進行過濾篩選,只需對聚合欄位即可。
在使用 copy_to 時,是通過指定聚合的名稱實現。

實際上,copy_to 不使用數組格式添加名稱,也會自動轉換成數據格式。

添加兩條數據,待校驗搜索:

# 向 person 中添加數據
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "廣東省珠海市",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true
}

PUT person/_doc/2
{
  "uId": 2,
  "name": "楊廣東",
  "age": 22,
  "address": null,
  "birthday": "2020-01-15T12:00:00Z",
  "money": 68.7,
  "isStrong": true
}

查詢 full_name 的值,會返回 name 和 address 相關的值的對象。

從上面返回結果看到,_source 中的欄位沒有增加相應的 copy_to 欄位名,所以 copy_to 只會拷貝欄位內容至索引,並不會改變包含的欄位。

總結

通過本文對創建 Mapping 文件的常用並且實用的操作介紹,也基本能掌握這些日常的使用。瞭解 Mapping 的功能操作,相信對存儲時的設計也有一定幫助。

個人博客: https://ytao.top
關註公眾號 【ytao】,更多原創好文
我的公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 依賴的頭文件 2. 函數定義 3. 函數作用 + dup和dup2都可用來複制一個現存的文件描述符,使兩個文件描述符指向同一個file結構體。 + 如果兩個文件描述符指向同一個file結構體,File Status Flag和讀寫位置只保存一份在file結構體中,並且file結構體的引用計數是 ...
  • 1. 使用LocationManager獲取地理位置信息 代碼如下: 註意事項:Manifest文件中添加許可權 2. 使用百度地圖顯示 ①登錄網址 http://lbsyun.baidu.com/apiconsole/key 註冊成為一名百度開發者,並申請API Key,註冊頁面如下 註冊成功,點擊 ...
  • 今天在Nginx上新加了一個功能變數名稱配置,然後nginx -t 檢查時,如下圖: 錯誤原因是:在Nginx配置文件時,有二個重覆的upstream名稱,配置xxx-uat導致,你可以在配置目錄grep下,去掉一個就可以了。如下圖 然後重新 nginx -t 檢查下,就不會報錯了 ...
  • docker的安裝在網上一搜一大把,windows安裝的就是exe雙擊,linux安裝需要執行語句 ps:需要準備xftp、xshell、vs 2019、linux伺服器、docker賬號密碼 例如: 伺服器剛買好時,最好執行一次yum update打開xshell,連接上linux伺服器安裝、運行 ...
  • 一、Oracle VM VirtualBox NatNetwork 設置(提供虛擬主機外網訪問) 1.1、進入全局設定 選擇網路 添加NAT網路 1.2、設置NAT 二、VirtualBox Host-Only設定(提供內網訪問) 2.1、配置Host-Only設置(建議設置順序為 網卡設定 DHC ...
  • 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 ...
  • ORA-00001: 違反唯一約束條件 (.) ORA-00017: 請求會話以設置跟蹤事件 ORA-00018: 超出最大會話數 ORA-00019: 超出最大會話許可數 ORA-00020: 超出最大進程數 () ORA-00021: 會話附屬於其它某些進程;無法轉換會話 ORA-00022: ...
  • 問題描述:本來還在愉快的工作中,突然同時通知客戶主資料庫無法登陸了,心中莫名的一緊,趕緊登陸資料庫查看,發現只有sys賬號可以正常登錄,其他賬號登錄均提示ORA00257錯誤。趕緊百度一下,看大致的意思為歸檔日誌寫滿了、閃回日誌寫滿了。根據網上提供的方法進行查看:select * from v$re... ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...