Elasticsearch實戰系列(七)--ES中字段的定義

一、字段的類型

  1. 核心類型
    1. 字符串text和keyword
    2. 數值
    3. 日期
    4. 布爾
  2. 其它類型
    1. 核心類型派生的複雜類型數組
    2. 嵌套類型,它允許在文檔中包含其它文檔
  3. 字符串text和keyword
    1. 其中text分詞用於全文檢索,而keyword不分詞用於聚合和排序
  4. 數值類型
    1. 可以是浮點數、也可以是非浮點數。如果不需要小數,可以選擇byte、short、int或者long
    2. 對於它們的選擇將會影響索引的大小,以及能夠索引的取值範圍
    3. 當不知道整數的範圍或者浮點數的精度時:
      1. 爲整數分配long,爲浮點數分配double。缺點在於索引可能變的更大。因爲這兩種類型佔據了更多的空間
  5. 日期類型:
    1. 用於存儲日期和時間
    2. 運行方式:
      1. 提供一個表示日期的字符串,然後ES解析該字符串,將其作爲long的數值存入到Lucene的索引。該long型數值是從1970年1月1號00:00:00 UTC(UNIX紀元)到所提供的時間之間已經過去的毫秒數
    3. 搜索時:
      1. 提供date的字符串,在後臺ES解析這些字符串並按照數值來處理。這樣做的原因是:和字符串相比,數值在存儲和處理時更快
    4. ES默認解析ISO 8601的時間戳
    5. 使用format選項來指定日期格式有兩種方式
      1. 使用預定義的日期格式
      2. 設置自己定製的格式
  6. 布爾類型:
    1. 用於存儲文檔中的true/false
    2. 當未設置mapping前直接索引文檔,文檔中設置爲true或false的字段被自定映射爲boolean,在Lucene的索引中被存儲爲代表true的T或者代表false的F。類似於日期類型,ES解析在文檔中提供的值,將true和false分別轉化爲T和F
  7. 數組:
    1. 當需要索引擁有多個值得字段,將這些值放入到方括號中
    2. ES處理方式:
      1. ES並沒有定義一個數組,映射將該字段定義爲字符串(keyword類型),和單個值同樣處理
    3. 核心類型都支持數組,無須修改映射,即可以使用單一值也可以使用數組

二、index選項

  1. index可以設置爲analyzed、not_analyzed、no
  2. analyzed:
    1. 分析器將所有字符轉化爲小寫,並將字符串分解爲單詞。當期望每個單詞被完整匹配時,請使用這種選項
  3. not_analyzed
    1. 分析過程被忽略,整個字符串被當單獨的詞條進行索引。
    2. 當進行精確匹配時,請使用這個選項,比如搜索標籤。如希望"big data"出現在搜索"big data"的結果中,而不是出現在搜索"data"的結果中
  4. no:
    1. 索引被忽略,也沒有詞條產生,因此無法在那個字段上進行搜索
    2. 當無須在這個字段上搜索時,這個選項節省了存儲空間,也縮短了索引和搜索的時間
  5. 注:
    1. 在ES6之後,index屬性支持false和true,false不能搜索相當於no,true可以索引。默認使用standar分詞

三、多字段

  1. 類似於數組允許使用同一個設置索引多項數據,而多字段允許使用不同的設置,對同一項數據索引多次
  2. 優勢:
    1. 無須重新索引數據,就能將單字段升級到多字段。若該字段已存在,自動觸發自動升級
  3. 缺點:
    1. 一旦子字段已經存在了,就不能將其抹去

四、預定義字段

  1. 預定義字段和自定義字段的不同點:
    1. 不用部署預定義字段,ES會做這件事情。例如使用_timestamp字段來記錄文檔索引的日期
    2. 揭示了字段相關的功能。例如_ttl(存活時間,time to live)字段使得ES可以在指定的時間過後刪除某些文檔
    3. 預定義字段總是以下劃線開頭
  2. 預定義字段的類別:
    1. 控制如何存儲和搜索你的文檔。_source在索引文檔的時候,存儲原始的JSON文檔。_all將所有的字段一起索引
    2. 唯一識別文檔。包含了索引文檔位置的數據:_uid、_id、_type和_index
    3. 爲文檔增加新的屬性。_size來索引原始JSON內容的大小。使用_timestamp來索引文檔索引的時間,並且使用_ttl來告知Elasticsearch在一定的時候後刪除該文檔
    4. 控制文檔路由到哪些分片。相關字段是_routing和parent
  3. 常見的預定義字段:
    1. _source、_all、_uid、_type、_id、_index
  4. _source:
    1. 按照原有格式來存儲原有的文檔,_source字段的enabled可以設置爲true或者false,來指定是否想要存儲原始的文檔。默認情況下是true
    2. 當_source已經被存儲,Elasticsearch從那裏獲取所需的字段。也可以通過設置store選項爲yes來存儲個別字段
      1. 優點:相當於檢索整個_source然後抽取而言,檢索單一的存儲字段要更快一些,尤其在文檔很大的時候
      2. 缺點:當存儲單獨的字段時,存儲的越多,索引越大。更大的索引意味着更慢的索引和搜索速度
  5. _all:
    1. 類似於_source存儲所有的信息,_all是索引所有的信息
    2. 當搜索_all字段的時候,ElasticSearch將在不考慮時哪個字段匹配的情況下,返回命中的文檔
    3. 在URL中通過q=elasticsearch來指定在_all上進行搜索
  6. _uid、_type、_id
    1. _uid字段是由_id和_type字段組成
    2. 由於所有文檔都存儲在同一個Lucene的索引中,ES內部使用_uid來確定唯一文檔
    3. _id通常從_uid抽取出來,但是_type必須單獨索引,這樣當搜索特定類型時,系統才能輕鬆的根據類型來過濾文檔
    4. _type和_id的分離是一種抽象,通過類型的區分使得針對不同結構的運作更爲容易
    5. 是否存儲和索引
      1. _uid默認存儲和索引
      2. _type默認不存儲和不索引
      3. _type默認不存儲和索引
  7. _index:
    1. 表示索引名稱,Elasticsearch知道每個結果來自於哪個索引,所以它可以展示_index的值
    2. 在多個索引進行搜索時,可以使用_index字段上的詞條聚集來展示每位用戶所擁有的文檔數量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章