這篇是介紹field data types的第三篇
主要介紹text, keyword差異以及multi-fields
keyword type family
keyword family包含了以下的field types:
keyword
: 用來儲存結構的內容,例如: IDs, email, 主機名稱, and etcconstant_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 比較好
舉幾個實例:
range
),比較常用字串比對來找書(term-level
)當然,如果覺得猶豫不決,覺得兩個都有需要,可以透過 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): fields
為 mapping 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
剛提到,這邊的 raw
是可以自定義的,不知道在讀前幾重,使用後分類 term
query的時候,其實是都使用 keyword
,為什麼呢?
直接新增一筆資料且index尚未被建立
PUT my-index-000007/_doc/1
{
"country": "Taiwan"
}
查看mapping
GET my-index-000007/_mapping
Response
可以發現到 fields
下是 keyword
,且有著 keyword
field data type
簡單來說就是,es預設遇到 string
field時,是會幫你建立兩個field,且field data type為 text
和 keyword
,其中 keyword
field data type 的field name 是 keyword
,以此為例,使用排序或後分類則用 country.keyword
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正