這篇是 Mapping 系列的最後一篇
主要介紹 Metadata fields 和 Mapping parameters
每一個document都會有metadata fields,記錄著此document的metadata
下列我挑幾一些個人覺得比較常用到的來說明
_index
: document屬於哪一個index
_type
: 此document的 mapping type (更詳細的介紹可參閱 Elastic Stack第十四重)
_id
: document的ID,此field是可以用在某些queries,也可以用在 aggs 和 sorting ,但是官方不建議用 _id
field來 aggs 和 sorting ,如果真有需要就額外新增一個 field,且複製 _id
內容至新增的field
_source
: 此document在新增的時候的原始JSON, _source
field 本身沒有被建立索引,也因此是無法搜尋的,儲存的內容主要是 fetch requests (get/search) 的回傳值
_meta
: 關於 mapping type 的 meta data
即 field mappings 使用的參數
以下針對幾個個人覺得比較可能會使用到的來說明,
注意的是,不是每個field type都會有這些參數
analyzer
es預設的 analyzer
為 standard
,
可以透過此參數指定 text analysis 的 analyzer ,
除非有指定 search_analyzer
,不然此 analyzer 會套用在 indexing 和 searching 的時機點
[注意] 只有 text
fields支援 analyzer
參數,
boost
此參數預設值為 1
,
設定此參數會讓 field 在 query時,影響計算的相關分數,
例如: title
field設定 boost
為 2
, 而 content
field不設定 boost
(即預設的1
),此時如果在搜尋時匹配到 title
的權重會是匹配到 content
的兩倍
如果想要讓某 field 的權重變更,除了可以在 mapping設定此參數,
也可以直接在搜尋 (e.g., term
queries) 設定權重
copy_to
此參數可以讓你複製多個fields的value至一個group field,
之後就可直接搜尋 group field來達成搜尋多個欄位
如果很常搜尋多個fields,可以用此方式來增加搜尋速度
舉個設定的範例
PUT my-index-000012
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
之後如要搜尋 first_name
和 last_name
,則可以直接使用 full_name
[Note]
copy_to
可以設定不只一個field,如多個fields,可以使用 array,如 "copy_to": [ "field_1", "field_2" ]
field_1
至 field_2
,又設定 copy field_2
至 field_3
,是沒辦法如表面上的會把 field_1
複製至 field_3
_source
是不會顯示 copied values ,所以是沒辦法用 _source
查看內的 group field 內的值的個人覺得這個很常用在搜尋框,搜尋框一般而言都是希望可以搜尋很多個欄位的值,就可以透過
copy_to
至 group field 達成
doc_values
除了 text
和 annotated_text
fields,都有此參數,且預設皆是開啟的(true
),
除非field真的不需要 aggs
, sort
或是 script不會取用field,才把 doc_values
關掉來省硬碟空間
enabled
es預設都是會對fields建立索引的,但有些時候是只想儲存值而不想建立索引,此時可以透過此參數來設定,不過這參數只能用在 top-level mapping 且 只有 object
field data type 有這參數設定
舉個情境:像是 session,可能會想透過 session ID來取得document,但其中的 session data可能就不需要被用來搜尋或 aggs 等
fielddata
如果 text
fields 也想用來 aggs
, sort
,
但是 text
沒有 doc_values
參數可用,那怎麼辦?text
fields 可以使用一種資料結構,是會在 query 時,儲存在memory的,即為 fielddata
fielddata
參數預設是關閉的 (false
),因為他會使用很多 heap space,
此外,loading fielddata 是個很 expensive 的過程,很有可能會讓使用者感受到延遲
如果真需要根據 text
field value做 sorting
或 aggs
可使用 multi-fields ,
可參閱 Elastic Stack第十七重
format
date
field type有介紹到,es提供了很多格式,提供的哪些格式可參閱官方介紹,就不多加闡述了
format
ignore_above
如果string超過此參數設定的長度,則不會被建立索引,不過還是會存在 _source
內
index
此field values是否被建立索引,預設是 true
如果沒有建立索引是不可被搜尋的
meta
field的metadata
情境:有多個應用程式會對同一index做操作,此時可以針對field提供一些metadata,想是 units(單位)
fields
也就是如何達成 multi-fields
的參數,詳細內容可參閱 Elastic Stack第十七重
null_value
null
值是不會被建立索引的,
透過此參數,可以設定當 null
值出現時,用指定的值來取代
[Note]
null_value
設定的值必須與此field的field data type一樣才行null_value
只是影響資料是如何被建立索引,不會影響 _source
儲存的JSONproperties
不管是 top-level 的type mapping,還是 object
或 nested
包含的 sub-fields都是使用此參數
similarity
用此參數可設定計算分數的演算法,預設為 BM25
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正
Metadata fields
Mapping parameters