iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 19

Elastic Stack第十九重

  • 分享至 

  • xImage
  •  

Mapping Part VII(結構)

這篇是 Mapping 系列的最後一篇
主要介紹 Metadata fieldsMapping parameters


Metadata fields

每一個document都會有metadata fields,記錄著此document的metadata

下列我挑幾一些個人覺得比較常用到的來說明

_index: document屬於哪一個index

_type: 此document的 mapping type (更詳細的介紹可參閱 Elastic Stack第十四重)

_id: document的ID,此field是可以用在某些queries,也可以用在 aggssorting ,但是官方不建議用 _id field來 aggssorting ,如果真有需要就額外新增一個 field,且複製 _id 內容至新增的field

_source: 此document在新增的時候的原始JSON, _source field 本身沒有被建立索引,也因此是無法搜尋的,儲存的內容主要是 fetch requests (get/search) 的回傳值

_meta: 關於 mapping type 的 meta data

Mapping parameters

即 field mappings 使用的參數

以下針對幾個個人覺得比較可能會使用到的來說明,
注意的是,不是每個field type都會有這些參數

analyzer
es預設的 analyzerstandard
可以透過此參數指定 text analysis 的 analyzer
除非有指定 search_analyzer ,不然此 analyzer 會套用在 indexing 和 searching 的時機點
[注意] 只有 text fields支援 analyzer 參數,

boost
此參數預設值為 1
設定此參數會讓 field 在 query時,影響計算的相關分數,
例如: title field設定 boost2, 而 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_namelast_name,則可以直接使用 full_name

[Note]

  • copy_to 可以設定不只一個field,如多個fields,可以使用 array,如 "copy_to": [ "field_1", "field_2" ]
  • copy 是沒辦法recursively 的,如 copy field_1field_2 ,又設定 copy field_2field_3 ,是沒辦法如表面上的會把 field_1 複製至 field_3
  • _source 是不會顯示 copied values ,所以是沒辦法用 _source 查看內的 group field 內的值的

個人覺得這個很常用在搜尋框,搜尋框一般而言都是希望可以搜尋很多個欄位的值,就可以透過 copy_to 至 group field 達成

doc_values
除了 textannotated_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做 sortingaggs 可使用 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]

  • 空array不會被此設定值替換
  • null_value 設定的值必須與此field的field data type一樣才行
  • null_value 只是影響資料是如何被建立索引,不會影響 _source 儲存的JSON

properties
不管是 top-level 的type mapping,還是 objectnested 包含的 sub-fields都是使用此參數

similarity
用此參數可設定計算分數的演算法,預設為 BM25


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


Reference

Metadata fields
Mapping parameters


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

尚未有邦友留言

立即登入留言