ElasticStack學習(七):ElasticSearch之Mapping初探

1、Mapping的概念html

  一、Mapping相似於數據庫中的Schema的定義,做用以下:正則表達式

    1)定義索引中的字段的名稱;數據庫

    2)定義字段的數據類型,例如字符串、數字、日期、布爾等;數組

    3)對每一個字段進行倒排索引的創建及相關配置;app

    4)Mapping會將Json文檔映射成Lucene所須要的扁平格式;學習

    5)一個Mapping屬於一個索引的Type,從7.0開始,不須要在Mapping中指定Type信息;url

  二、字段的數據類型spa

    1)簡單類型插件

      Text(會增長Keyword子字段);3d

      Date;

         Integer/Long/Floating;

      Boolean;

      IP4&IP6;

      Keyword;

    2)複雜類型

      對象類型;

      嵌套類型;

      數組(由第一個非空數值的類型所決定);

      空值;

    3)特殊類型(地理信息)

      geo_point&geo_shape

2、Dynamic Mapping的概念

  一、在寫入文檔的時候,若是索引不存在,則會自動建立索引;

  二、因爲上述機制,能夠無需手動定義Mapping,ElasticSearch會自動根據文檔信息,推算出字段的類型;

  三、可是有時候推算的可能不對,當類型設置的不對時,會致使一些功能沒法正常運行,好比範圍內的Range查詢;

3、Mapping與Dynamic Mapping的使用

  一、推斷字段的類型

//建立一個文檔 put mapping_test/_doc/1 { "id":"100", "isvip":false, "isadmin":"true", "age":18, "height":180 } //查看索引Mapping結構 get mapping_test/_mapping //刪除索引 delete mapping_test

   

  由上圖中能夠得出,ElasticSearch基本上能夠按照數據推斷出預想的字段類型,因爲isadmin字段的值是由雙引號所括起來的,因此該字段被推斷成text類型。

  二、更改Mapping的字段類型

  對於索引後期加入的字段,能夠按照以下狀況進行設置:

    1)新增長字段

      a)Dynamic設置爲True時,一旦有新增字段的文檔寫入,Mapping同時會被更新;

      b)Dynamic設置爲False時,有新增字段的文檔寫入,Mapping不會被更新,新增字段的數據也沒法被索引,可是信息會出如今_Source中;

      c)Dynamic設置成Strict時,文檔寫入失敗;

    

    2)已有字段

      a)對於已有字段,一旦已經有數據寫入,就再也不支持修改字段定義。由於Lucene實現的倒排索引,一旦生成後,就不容許修改。

      b)若是但願改變已有字段類型,必須ReIndex,重建索引;

      爲何會這樣?

      I)若是修改了字段的數據類型,會致使已被索引的屬於沒法被搜索;

      II)正由於如此,對於新增長的字段,就不會有這個問題的影響;

  三、對於這幾種狀況,咱們經過下圖進行演示:

    1)對於dynamic爲true時,對於建立的文檔中的某一字段進行搜索,是能夠查詢到的。

    

    2)將dynamic設置爲false,而後新增一個name字段,而後對其搜索,是沒法搜索到的。

    

    同時mapping中也不存在該字段。

    

    可是能夠在_Source中看到這個字段。

    

    3)將dynamic設置爲strict,而後新增一個grade字段,會發現出現異常。

     

 4、索引Mapping的顯式定義

  一、Mapping定義的方式有兩種:

    1)能夠參考API手冊,純手寫;

    2)爲了減小輸入工做量,減小出錯機率,能夠依照如下步驟:

      a)建立一個臨時的Index,寫入一些樣本數據;

      b)經過訪問Mapping API獲取該臨時索引的動態Mapping定義;

      c)修改爲符合要求的Json,而後建立顯式索引;

      d)將臨時索引刪除;

  二、顯式Mapping定義的語法:

Put Index_Name { "mappings":{ 定義Mapping信息,Json格式
     "properties":{
        "column_name":{
          "type":"text"
        },
        "column_name":{
          "type":"long"
        }
        ...
      }
}
}

  三、顯式Mapping定義的說明:

    1)控制當前字段是否能夠被索引,默認是True。若是設置成False,則該字段不可被搜索。

     將不被搜索的字段設置成索引爲false,能夠節省磁盤開銷,由於這樣該字段就不須要進行倒排索引了。

 

    2)對於須要索引的字段,ElasticSearch提供了Index_options配置,能夠控制倒排索引記錄的內容,Index_options提供了四種控制級別:

      a)docs:記錄doc的Id;

      b)freqs:記錄doc Id、Term Frequencies;

      c)positions:記錄doc Id、Term Frequencies、Term Position;

      d)offsets:記錄doc Id、Term Frequencies、Term Position、Character offsets;

    3)Text類型默認是positions級別,其餘類型默認是docs級別;

    4)索引字段須要記錄的內容越多,那麼佔用存儲空間越大;

    5)只有keyword類型支持設定Null值;

    

    6)copy_to的設置,是將字段的值拷貝到所設定的目標字段中,當查詢時,能夠將該目標字段作爲搜索字段進行查詢。可是該目標字段不會出如今_source中。

    

     7)數組類型在ElasticSearch中並不提供,可是對於任何字段,是能夠包含多個相同類型的數據的。

     

    8)對字段還能夠指定特定的analyzer。

    

    9)查看索引Mapping,以下所示:  

    

5、ElasticSearch字段特性與自定義Analyzer

  一、Exact Values(精確值)、Full Text(全文本)

    Exact Values就是指具體數字、日期、字符串,此類值是不須要進行分詞的;

    Full Text:是非結構化的文本數據,是須要進行分詞的;

  

  二、自定義分詞器

  當ElasticSearch自帶的分詞器沒法知足要求時,能夠自定義分詞器,經過組合不一樣的Character Filter、Tokenizer、Token Filter進行實現。

  1)Charater Filters

    a)在Tokenizer以前,經過使用Character Filters對文本進行處理,如刪除或者替換字符。此種處理會影響後續Tokenizer對Term的Position與Offset的信息。

    b)能夠設置多個Character Filters,一個自帶的Character Filters包括:HTML Strip(去除HTML標籤)、Mapping(字符串替換)、Pattern Replace(正則表達式替換)。

    以下圖所示:

    

    

    

  2)Tokenizer

    a)將原始的文本按照必定的規則,進行切分紅詞(Term or Token);

    b)內置的Tokenizer有:Standard、uax_url_email、WhiteSpace、keyword、Pattern、Path hierarchy;

    c)能夠實現本身的Tokenizer插件;

    以下圖所示:

    

   3)Token Filters

    a)將Tokenizer輸出的Term,進行增長、修改、刪除;

    b)內置的Token Filters有:lowercase、stop、synonym(近義詞);

    以下圖所示:

    

  三、自定義Analyzer使用

   

  在圖中的emotion、customer、english_stop,是分別對Character Filter、Tokenizer、Token Filter的自定義配置。

   

  注意:字段類型keyword與text類型的子字段keyword的說明:

    一、一切文本類型的字符串能夠定義成"text"或"keyword"兩種類型。區別在於,text類型會使用默認分詞器分詞(固然也能夠指定特定的分詞器),keyword類型默認不會對其進行分詞;

    二、多字段類型狀況下,查詢時能夠用title,也能夠用title.keyword查詢類型爲keyword的子字段;

 

  你們可關注個人公衆號 

    

  知識學習來源:阮一鳴:《Elasticsearch核心技術與實戰》  

原文出處:https://www.cnblogs.com/supersnowyao/p/11189661.html

相關文章
相關標籤/搜索