Elasticsearch7.X 入門學習第五課筆記---- - Mapping設定介紹

原文: Elasticsearch7.X 入門學習第五課筆記---- - Mapping設定介紹

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接: https://blog.csdn.net/qq_36697880/article/details/100660867

         Elasticsearch的Mapping,定義了索引的結構,相似於關係型數據庫的Schema。Elasticsearch的Setting定義中定義分片和副本數以及搜索的最關鍵組件,即:Analyzer,也就是分析器。php

 1、Dynamic Mapping及經常使用字段類型

   mapping 的定義

     Mapping相似於關係型數據庫的Schema,主要包含如下內容:html

  1. 定義索引中字段的名稱
  2. 定義字段的數據類型,如:字符串、數字、boolean等
  3. 可對字段設置倒排索引的相關配置,如是否須要分詞,使用什麼分詞器

從7.x開始,一個Mapping只屬於一個索引的typepython

  1. 每一個文檔屬於一個type
  2. 一個type有且僅有一個Mapping定義
  3. 從7.x開始,不須要在Mapping中指定type信息,默認type爲_doc

經常使用字段類型

在Elasticsearch中,字段數據類型有如下經常使用的類型:sql

  1. 簡單類型
    • Text / Keyword - 文本 / 關鍵字
    • Date - 日期
    • Integer / Float - 數字 / 浮點
    • Boolean - 布爾值
    • IPv4 / IPv6 - ip地址
  2. 複雜類型,包括對象和數組
    • 對象
    • 數組
  3. 特殊類型,如地理信息
    • geo_point / ...

Dynamic Mapping 

  Dynamic Mapping 翻譯爲動態Mapping:數據庫

  1. 在寫入文檔時,若是索引不存在,會自動建立索引
  2. 這種機制,使得咱們無需手動定義mappings。Elasticsearch會自動根據文檔信息,推算出字段的類型
  3. 有的時候,Elasticsearch可能會推算不對,如:地理位置信息
  4. 當類型推算得不對時,可能致使一些功能沒法正常運行,如Range查詢。

經常使用類型的自動識別規則swift

類型 規則
字符串 匹配到日期格式,設置成Date。
字符串爲數字時,當成字符串處理,但咱們設置轉換爲數字。
其餘狀況,類型就是Text,而且會增長keyword的子字段
布爾值 Boolean
浮點數 Float
整數 Long
對象 Object
數組 由第一個非空數值的類型決定
空值 忽略

   下面是具體推斷 demoapi

  
  
  
   
   
            
   
   
  1. # 寫入文檔,查看 Mapping
  2. PUT mapping_test/_doc/ 1
  3. {
  4. "firstName": "Chan", -- Text
  5. "lastName": "Jackie", -- Text
  6. "loginDate": "2018-07-24T10:29:48.103Z" -- Date
  7. }
  8. # Dynamic Mapping,推斷字段的類型
  9. PUT mapping_test/_doc/ 1
  10. {
  11. "uid": "123", -- Text
  12. "isVip": false, -- Boolean
  13. "isAdmin": "true", -- Text
  14. "age": 19, -- Long
  15. "heigh": 180 -- Long
  16. }
  17. # 查看 Dynamic Mapping
  18. GET mapping_test/_mapping

   可否更改mapping的字段類型

分兩種狀況:數組

一、新增長的字段app

  • dynamic設爲true時,新增字段的文檔寫入時,Mapping同時被更新
  • dynamic設爲false時,Mapping不會被更新,新增字段的數據沒法被索引,可是會出如今_source中
  • dynamic設爲strict,文檔將寫入失敗

 二、已存在的字段,一旦數據被寫入,就再也不支持修改字段定義學習

  • Lucene自己的限制
  1. 若是但願更改字段類型,必須Reindex api,即:重建索引。在數據量多的時候,開銷將很是大
  
  
  
   
   
            
   
   
  1. # dynamic設置爲 false
  2. PUT idx1
  3. {
  4. "mapping": {
  5. "_doc": {
  6. "dynamic": "false"
  7. }
  8. }
  9. }
  10. # 修改成 dynamicfalse
  11. PUT idx1/_mapping
  12. {
  13. "dynamic": false
  14. }
  15. # 查看索引
  16. GET idx1/_mapping

dynamic屬性和索引字段可變性的規則,咱們能夠總結以下:

\ true false strict
文檔可索引 yes yes no
字段可索引 yes no no
Mapping被更新 yes no no

顯式Mapping及常見參數

       在本文的上一段落,咱們的Mapping都是自動生成的。自動生成機制雖然方便,可是也可能致使一些問題。好比:生成的字段類型不正確,字段的附加屬性不知足咱們的需求,等等。這時,咱們能夠經過顯式Mapping的方式來解決。

那麼,咱們如何進行顯式Mapping的設置呢?

  

  1. 參考官網api,純手寫
  2. 爲減小工做量,減小出錯機率,可以下進行:
    1. 建立一個臨時index,寫入一些樣本數據
    2. 經過訪問Mapping API獲取該臨時文件的動態Mapping定義
    3. 修改後,再使用此配置建立本身的索引
    4. 刪除臨時索引

咱們推薦使用第二種方式,效率高,且不容易出錯。

    控制當前字段是否被索引———index

    index,可用於設置字段是否被索引,默認爲true,false即爲不可搜索。在下述例子中,mobile字段將不能被搜索到。

  
  
  
   
   
            
   
   
  1. # index屬性控制 字段是否能夠被索引
  2. PUT user_test
  3. {
  4. "mappings": {
  5. "properties": {
  6. "firstName":{
  7. "type": "text"
  8. },
  9. "lastName":{
  10. "type": "text"
  11. },
  12. "mobile" :{
  13. "type": "text",
  14. "index": false
  15. }
  16. }
  17. }
  18. }

常見參數 - index_options

記錄索引級別。Text類型默認爲positions,其餘類型默認爲docs。咱們須要記住一條準則。

記錄的內容越多,佔用的存儲空間就越大。

索引級別有如下幾種,更細節的內容可參考官網

  1. docs
  2. freqs
  3. positions
  4. offsets

 

null_value設置

   須要對Null值實現搜索時使用。只有keyword類型才支持設定null_value

  
  
  
   
   
            
   
   
  1. # 設定Null_value
  2. DELETE users
  3. PUT users
  4. {
  5. "mappings" : {
  6. "properties" : {
  7. "firstName" : {
  8. "type" : "text"
  9. },
  10. "lastName" : {
  11. "type" : "text"
  12. },
  13. "mobile" : {
  14. "type" : "keyword",
  15. "null_value": "NULL"
  16. }
  17. }
  18. }
  19. }
  20. PUT users/_doc/ 1
  21. {
  22. "firstName": "Zhang",
  23. "lastName": "Fubing",
  24. "mobile": null
  25. }
  26. PUT users/_doc/ 2
  27. {
  28. "firstName": "Zhang",
  29. "lastName": "Fubing2"
  30. }
  31. # 查看結果,有且僅有_id爲2的記錄
  32. GET users/_search
  33. {
  34. "query": {
  35. "match": {
  36. "mobile": "NULL"
  37. }
  38. }
  39. }

 copy_to

這個屬性用於將當前字段拷貝到指定字段。

  1. _all在7.x版本已經被copy_to所代替
  2. 可用於知足特定場景
  3. copy_to將字段數值拷貝到目標字段,實現相似_all的做用
  4. copy_to的目標字段不出如今_source中
  
  
  
   
   
            
   
   
  1. DELETE user_test
  2. #設置 Copy to
  3. PUT user_test
  4. {
  5. "mappings": {
  6. "properties": {
  7. "firstName":{
  8. "type": "text",
  9. "copy_to": "fullName"
  10. },
  11. "lastName":{
  12. "type": "text",
  13. "copy_to": "fullName"
  14. }
  15. }
  16. }
  17. }
  18. PUT user_test/_doc/ 1
  19. {
  20. "firstName": "Ruan",
  21. "lastName": "Yiming"
  22. }
  23. POST user_test/_search?q=fullName:(Ruan Yiming)

數組類型

Elasticsearch不提供專門的數組類型。但任何字段,均可以包含多個相同類型的數值。

  
  
  
   
   
            
   
   
  1. # 數組類型
  2. PUT users/_doc/ 1
  3. {
  4. "name": "onebird",
  5. "interests": "reading"
  6. }
  7. PUT users/_doc/ 1
  8. {
  9. "name": "twobirds",
  10. "interests":[ "reading", "music"]
  11. }
  12. POST users/_search
  13. {
  14. "query": {
  15. "match_all": {}
  16. }
  17. }
  18. # interests字段仍是text類型
  19. GET users/_mapping
相關文章
相關標籤/搜索