iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 17

Elastic Stack第十七重

  • 分享至 

  • xImage
  •  

Mapping Part V(結構)

這篇是介紹field data types的第三篇
主要介紹text, keyword差異以及multi-fields


keyword type family
keyword family包含了以下的field types:

  • keyword: 用來儲存結構的內容,例如: IDs, email, 主機名稱, and etc
  • constant_keyword: 如其名,儲存相同的值
  • wildcard: 優化logs,可使用像是 grep功能的 wildcard queries

此處僅詳細介紹最常被使用到的 keyword
keyword fields 很常在 sorting , aggregations 以及 term-level queries 使用他
而如果要使用 full-text search(全文檢索)功能的話,要避免使用 keyword fields
改用 text field type

issue(議題): identifiers (id) 該使用 numeric field data type, 像是 integer, long field data type,還是使用 keyword fields呢?

說明這兩個data type對於哪種query比較優,便可清楚明瞭,
numeric,即 integer, long field data type,使用 range queries 比較優
keyword field data type 使用 term 或 其他的 term-level queries 比較好

舉幾個實例:

  • 國際標準書號(ISBN),不會只是數值,而且很少搜尋某數值區間(range),比較常用字串比對來找書(term-level)
  • product ID,產品ID,通常也是英文字配數字,此時也都是用字串比對,而非搜尋數值是否落於某區間

當然,如果覺得猶豫不決,覺得兩個都有需要,可以透過 multi-fields 來達成,此篇文章後半段會介紹

text field type
此field可使用全文檢索query,輸入的值即為 full-text values (全文檢索的值),
被定義為 text 的field 輸入的值是會被 analyzed (分析) 的,
會經過 analyzer ,把 string 轉換成許多獨立的terms,然後才建立索引

text fields 不是被拿來用作 sorting , aggregations 的,
如果要使用 structured content,則使用 keyword field

所以會納悶,那假如我現在某一個field是希望有 full text(text) 又有 structured content(keyword)來 sorting , aggregations 怎麼辦?
很簡單,就建立一個text,也建立一個keyword,這就是 multi-fields

multi-fields
為了不同的目的,對一樣的field用不同方法來建立索引,即為 multi-fields
例如: 一個 string field,為了全文檢索而建立了 text field,為了排序或aggs而建立了 keyword field

mapping parameters 之一 fields
上述在定義 field type時,是填入 type,而 fields 就是和 type 同level的另一個參數

直接看範例
Reqeust

PUT my-index-000006
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": { (2)
          "raw": { (1)
            "type":  "keyword"
          }
        }
      }
    }
  }
}

(1): city.raw field 是 city field 的 keyword 版本, 這邊的 raw 可以自定義
(2): fieldsmapping parameters

index sample documents

PUT my-index-000006/_doc/1
{
  "city": "New York"
}

PUT my-index-000006/_doc/2
{
  "city": "York"
}

full text search with sorting and aggs

GET my-index-000006/_search
{
  "query": {
    "match": {
      "city": "york" (1)
    }
  },
  "sort": {
    "city.raw": "asc" (2)
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" (2)
      }
    }
  }
}

(1): 有著 text field data type 的 city,使用 全文檢索
(2): 有著 keyword field data type 的 city.raw ,使用 sorting(排序) 和 aggs(後分類)

Response
Response

剛提到,這邊的 raw 是可以自定義的,不知道在讀前幾重,使用後分類 term query的時候,其實是都使用 keyword,為什麼呢?

直接新增一筆資料且index尚未被建立

PUT my-index-000007/_doc/1
{
  "country": "Taiwan"
}

查看mapping

GET my-index-000007/_mapping

Response
Response

可以發現到 fields 下是 keyword,且有著 keyword field data type
簡單來說就是,es預設遇到 string field時,是會幫你建立兩個field,且field data type為 textkeyword ,其中 keyword field data type 的field name 是 keyword,以此為例,使用排序或後分類則用 country.keyword


小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正


Reference

Field data types
fields


上一篇
Elastic Stack第十六重
下一篇
Elastic Stack第十八重
系列文
Elastic Stack武學練功坊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言