字段類型按family分組。同一族中的類型具有完全相同的搜索行為,但可能具有不同的空間使用或性能特征。
目前,除了字符串有兩種family類型:keyword 和 text。 其他類型系列只有一個(gè)字段類型, 例如boolean類型族由一種字段類型組成:boolean 。
常見類型
-
binary
編碼為 Base64 字符串的二進(jìn)制值。 該字段默認(rèn) 不存儲(chǔ)到索引 且 不可搜索。參數(shù) 意義 doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為 false。store 字段值是否應(yīng)與字段 _source分開存儲(chǔ)和檢索。接受true或false(默認(rèn))。參數(shù)講解:
-
doc_values: 倒排索引這種數(shù)據(jù)結(jié)構(gòu)并不適合用作聚合,排序,在腳本里訪問字段等等這些場(chǎng)景,于是 doc_values 數(shù)據(jù)結(jié)構(gòu)應(yīng)運(yùn)而生。 doc_values 為 true 時(shí),es同時(shí)會(huì)以列的方式保存一份數(shù)據(jù)用作聚合,排序。
binary數(shù)據(jù)類型使用:
PUT my-index-000001 { "mappings": { "properties": { "blob": { "type": "binary", "doc_values": false, "store": false } } } } -
-
boolean
true 或者 false參數(shù) 意義 doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為 false。index 該字段是否應(yīng)該可以快速搜索?接受 true(默認(rèn))和false. 僅doc_values啟用的字段仍然可以使用基于術(shù)語或范圍的查詢進(jìn)行查詢,盡管速度較慢。null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為 null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則script無法設(shè)置。script 字段值將基于腳本轉(zhuǎn)換所得, 不再依賴doc文檔中的輸入。 on_script_error script中的腳本運(yùn)行失敗時(shí)的策略。默認(rèn)為fail, 返回doc文檔插入失敗。store 字段值是否應(yīng)與字段 _source分開存儲(chǔ)和檢索。接受true或false(默認(rèn))。meta 關(guān)于字段的元數(shù)據(jù)。
-
Keywords
Keywords關(guān)鍵字族,包括keyword、constant_keyword和wildcard。
關(guān)鍵字字段通常用于排序, 聚合, 術(shù)語級(jí)別的查詢 ,例如term。-
keyword
適用于 結(jié)構(gòu)化內(nèi)容 ,例如 ID、電子郵件地址、主機(jī)名、狀態(tài)代碼、郵政編碼或標(biāo)簽。
參數(shù)講解:參數(shù) 意義 doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為 true。eager_global_ordinals 是否應(yīng)該在刷新時(shí)急切地加載全局序數(shù)?接受true或false (默認(rèn))。對(duì)于常用于 術(shù)語聚合的字段建議開啟。fields 多字段允許為不同目的以多種方式索引相同的字符串值,例如一個(gè)用于搜索的字段和一個(gè)用于排序和聚合的多字段。 ignore_above 不要索引任何長(zhǎng)于該值的字符串。默認(rèn)為, 2147483647以便接受所有值。但是請(qǐng)注意,默認(rèn)動(dòng)態(tài)映射規(guī)則會(huì)創(chuàng)建一個(gè)子keyword字段,通過設(shè)置覆蓋此默認(rèn)值ignore_above:256。index 該字段是否應(yīng)該可以快速搜索?接受 true(默認(rèn))和false. 僅doc_values啟用的字段仍然可以使用基于術(shù)語或范圍的查詢進(jìn)行查詢,盡管速度較慢。index_options 出于評(píng)分目的,應(yīng)將哪些信息存儲(chǔ)在索引中。默認(rèn)為 docs但也可以設(shè)置為freqs在計(jì)算分?jǐn)?shù)時(shí)考慮詞頻。meta 關(guān)于字段的元數(shù)據(jù)。 norms 字段長(zhǎng)度是否對(duì)查詢?cè)u(píng)分有影響。接受true或false(默認(rèn))。 null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為 null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則script無法設(shè)置。script 字段值將基于腳本轉(zhuǎn)換所得, 不再依賴doc文檔中的輸入。 on_script_error script中的腳本運(yùn)行失敗時(shí)的策略。默認(rèn)為fail, 返回doc文檔插入失敗。store 字段值是否應(yīng)與字段 _source分開存儲(chǔ)和檢索。接受true或false(默認(rèn))。similarity 應(yīng)該使用 哪種評(píng)分算法或相似度。默認(rèn)為BM25. normalizer 如何在索引之前對(duì)關(guān)鍵字進(jìn)行預(yù)處理。默認(rèn)為null,表示關(guān)鍵字保持原樣。 split_queries_on_whitespace 為該字段構(gòu)建查詢時(shí),全文查詢是否應(yīng)在空格上拆分輸入。接受true或false(默認(rèn))。 -
eager_global_ordinals:為了支持字段值的聚合和其他操作,Elasticsearch 使用了一種稱為 doc values 的數(shù)據(jù)結(jié)構(gòu)。在基于字段類型為術(shù)語的場(chǎng)景下, 使用 增量整數(shù)或序數(shù) 替代 相同的術(shù)語 可以使 doc values 存儲(chǔ)更緊湊。 -
fields:給字段設(shè)置額外的類型和索引方式。例如主類型為text用于全文搜索,同時(shí)設(shè)置一個(gè)keyword用于排序或聚合。 -
ignore_above:超過ignore_above值所標(biāo)記的長(zhǎng)度,則不會(huì)被存儲(chǔ)和索引(不影響_source的原始數(shù)據(jù))。默認(rèn)為2147483647, 基本可接受全部長(zhǎng)度。 -
index:該字段是否應(yīng)該被快速搜索(被倒排索引存儲(chǔ)),接受true(默認(rèn))和 false。如果字段doc_values存在仍然可以被查詢, 只是相對(duì)比慢一些(doc_values對(duì)應(yīng)的是正排索引)。
-
-
constant_keyword
適用于始終包含相同值的關(guān)鍵字字段, 例如 枚舉值。
-
wildcard
用于非結(jié)構(gòu)化機(jī)器生成的內(nèi)容, 例如日志等一些需要經(jīng)常正則匹配查詢的內(nèi)容。
-
-
Numbers
數(shù)字類型,例如long和double,用于表示金額。數(shù)字類型 參考 long 一個(gè)有符號(hào)的 64 位整數(shù),最小值為 ,最大值為
。
integer 一個(gè)有符號(hào)的 32 位整數(shù),最小值為 ,最大值為
。
short 一個(gè)有符號(hào)的 16 位整數(shù),最小值為 -32768,最大值為 32767 。 byte 一個(gè)有符號(hào)的 8 位整數(shù),最小值為-128,最大值為127。 double 雙精度 64 位 IEEE 754 浮點(diǎn)數(shù),限制為有限值。 float 單精度 32 位 IEEE 754 浮點(diǎn)數(shù),限制為有限值。 half_float 半精度 16 位 IEEE 754 浮點(diǎn)數(shù),限制為有限值。 scaled_float 由 long 支持的浮點(diǎn)數(shù),按固定double比例因子縮放。 unsigned_long 一個(gè)無符號(hào)的 64 位整數(shù),最小值為 0,最大值為 。
PUT my-index-000001 { "mappings": { "properties": { "number_of_bytes": { "type": "integer" }, "time_in_seconds": { "type": "float" }, "price": { "type": "scaled_float", "scaling_factor": 100 } } } }參數(shù) 意義 coerce 嘗試將字符串轉(zhuǎn)換為數(shù)字并截?cái)嗾麛?shù)的分?jǐn)?shù)。接受true(默認(rèn))和false. doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?默認(rèn)為 false。ignore_malformed 是否忽略錯(cuò)誤格式的數(shù)字。如果false(默認(rèn)),格式錯(cuò)誤的數(shù)字會(huì)引發(fā)異常并拒絕整個(gè)文檔。 index 該字段是否應(yīng)該可以快速搜索?接受 true(默認(rèn))和false. 僅doc_values啟用的字段仍然可以使用基于術(shù)語或范圍的查詢進(jìn)行查詢,盡管速度較慢。null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為 null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則script無法設(shè)置。script 字段值將基于腳本轉(zhuǎn)換所得, 不再依賴doc文檔中的輸入。 on_script_error script中的腳本運(yùn)行失敗時(shí)的策略。默認(rèn)為fail, 返回doc文檔插入失敗。store 字段值是否應(yīng)與字段 _source分開存儲(chǔ)和檢索。接受true或false(默認(rèn))。meta 關(guān)于字段的元數(shù)據(jù)。 Dates
日期類型,包括date和date_nanos。-
alias
映射定義索引中字段的alias備用名稱。別名可用于代替搜索請(qǐng)求中的目標(biāo)字段。別名的使用限制:- 目標(biāo)必須是具體字段,而不是對(duì)象或其他字段別名。
- 目標(biāo)字段在創(chuàng)建別名時(shí)必須存在。
- 如果定義了嵌套對(duì)象,則字段別名必須具有與其目標(biāo)相同的嵌套范圍。
- 字段別名只能有一個(gè)目標(biāo)
對(duì)象和關(guān)系類型
-
object
一個(gè) JSON 對(duì)象。PUT my-index-000001 { "mappings": { "properties": { "region": { "type": "keyword" }, "manager": { "properties": { "age": { "type": "integer" }, "name": { "properties": { "first": { "type": "text" }, "last": { "type": "text" } } } } } } } }參數(shù) 意義 dynamic 是否允許在插入文檔doc時(shí)由動(dòng)態(tài)映射為 object的properties新增屬性。接受true(默認(rèn))runtime、false 和strict。enabled 為對(duì)象字段提供的 JSON 值是否應(yīng)該被解析和索引(true默認(rèn))或完全忽略(false)。 properties 對(duì)象內(nèi)的字段,可以是任何數(shù)據(jù)類型,包括object。 可以將新屬性添加到現(xiàn)有對(duì)象。
-
flattened
默認(rèn)情況下, ES會(huì)為object中每個(gè)子字段進(jìn)行映射和索引(如果事先不知道子字段的名稱和類型, 則動(dòng)態(tài)映射它們)。 這種情況下, 如果這個(gè)object類型的對(duì)象存在大量的子字段, 會(huì)導(dǎo)致子字段映射爆炸。而flattened類型就是為這種情況應(yīng)運(yùn)而生的。ES會(huì)把
flattened類型的JSON對(duì)象作為單個(gè)字段,只把它的 葉子值 作為關(guān)鍵字索引一個(gè)字段中。然后可以通過簡(jiǎn)單的查詢和聚合來搜索對(duì)象的內(nèi)容。PUT bug_reports { "mappings": { "properties": { "title": { "type": "text" }, "labels": { "type": "flattened" } } } } POST bug_reports/_doc/1 { "title": "Results are not sorted correctly.", "labels": { "priority": "urgent", "release": ["v1.2.5", "v1.3.0"], "timestamp": { "created": 1541458026, "closed": 1541457010 } } } # 這里的查詢直接以 ‘labels’ 作為關(guān)鍵字!??! POST bug_reports/_search { "query": { "term": {"labels": "urgent"} } }參數(shù) 意義 depth_limit 就嵌套內(nèi)部對(duì)象而言,展平對(duì)象字段的最大允許深度。如果展平的對(duì)象字段超過此限制,則會(huì)引發(fā)錯(cuò)誤。默認(rèn)為20 doc_values 該字段是否應(yīng)該以列的方式存儲(chǔ)在磁盤上,以便以后可以用于排序、聚合或腳本?接受true (默認(rèn))或false. eager_global_ordinals 是否應(yīng)該在刷新時(shí)急切地加載全局序數(shù)?接受true或false (默認(rèn))。對(duì)于常用于 術(shù)語聚合的字段建議開啟。ignore_above 超過此限制的葉值將不會(huì)被索引。默認(rèn)情況下,沒有限制,所有值都將被索引。請(qǐng)注意,此限制適用于展平對(duì)象字段中的葉值,而不是整個(gè)字段的長(zhǎng)度。 index 確定該字段是否應(yīng)該是可搜索的。接受true(默認(rèn))或 false. index_options 出于評(píng)分目的,應(yīng)將哪些信息存儲(chǔ)在索引中。默認(rèn)為docs但也可以設(shè)置為freqs在計(jì)算分?jǐn)?shù)時(shí)考慮詞頻。 null_value 當(dāng)文檔中該字段為空時(shí),這個(gè)值會(huì)當(dāng)作默認(rèn)值填充到字段中。默認(rèn)為 null,這意味著該字段被視為缺失。請(qǐng)注意,如果使用參數(shù),則script無法設(shè)置。similarity 應(yīng)該使用 哪種評(píng)分算法或相似度。默認(rèn)為BM25. split_queries_on_whitespace 為該字段構(gòu)建查詢時(shí),全文查詢是否應(yīng)在空格上拆分輸入。接受true或false(默認(rèn))。 -
nested
nested類型是object數(shù)據(jù)類型的特殊版本,它允許對(duì)對(duì)象數(shù)組進(jìn)行索引,從而可以相互獨(dú)立地查詢它們。默認(rèn)情況下,
object數(shù)據(jù)類型對(duì)于數(shù)組的映射和索引使用的是扁平化展開的方式。PUT my-index-000001/_doc/1 { "group" : "fans", "user" : [ { "first" : "John", "last" : "Smith" }, { "first" : "Alice", "last" : "White" } ] }實(shí)際上,上面文檔將在內(nèi)部轉(zhuǎn)換為看起來更像這樣的文檔:
{ "group" : "fans", "user.first" : [ "alice", "john" ], "user.last" : [ "smith", "white" ] }為了讓
object類型字段內(nèi)的數(shù)組對(duì)象之間保持獨(dú)立性,nested便應(yīng)運(yùn)而生了?。?!參數(shù) 意義 dynamic 是否允許在插入文檔doc時(shí)由動(dòng)態(tài)映射為 object的properties新增屬性。接受true(默認(rèn))runtime、false 和strict。properties 對(duì)象內(nèi)的字段,可以是任何數(shù)據(jù)類型,包括object。 可以將新屬性添加到現(xiàn)有對(duì)象。 -
join
為同一索引中的文檔定義父/子關(guān)系。- mapping定義,
relations:{ "parent-field" : "child-field"}
PUT my-index-000001 { "mappings": { "properties": { "my_id": { "type": "keyword" }, "my_join_field": { "type": "join", "relations": { "question": "answer" } } } } }- 插入parent-doc的兩種方式
PUT my-index-000001/_doc/1?refresh { "my_id": "1", "text": "This is a question", "my_join_field": { "name": "question" } } PUT my-index-000001/_doc/1?refresh { "my_id": "1", "text": "This is a question", "my_join_field": "question" }- 插入child-doc
PUT my-index-000001/_doc/3?routing=1&refresh { "my_id": "3", "text": "This is an answer", "my_join_field": { "name": "answer", "parent": "1" } }1. `?routing=parent-doc-id`路由值是強(qiáng)制性的,因?yàn)楦肝臋n和子文檔必須在同一個(gè)分片上建立索引。 2. `"answer"`為 `parent/child` 關(guān)系中的`child`, 因此必須添加`"parent"`字段, 且填充`parent/child` 關(guān)系中的`parent-id`。 3. 在`插入parent-doc`的例子里面, 沒有添加`"parent"`字段。因?yàn)閌"question"`是`parent/child` 關(guān)系中的`parent`,插入`parent-doc`時(shí), ES會(huì)默認(rèn)填充`_id`到`"parent"`字段中。-
join 使用限制
- 一個(gè)索引最多只能有一個(gè)
join類型字段 -
parent-doc和child-doc必須在同一個(gè)shard分片中 - 一個(gè)元素可以有多個(gè)子元素,但只有一個(gè)父元素。
- 可以向現(xiàn)有
join字段添加新關(guān)系。 - 也可以將子元素添加到現(xiàn)有元素,但前提是該元素已經(jīng)是父元素。
- 一個(gè)索引最多只能有一個(gè)
-
使用 join 搜索
-
join會(huì)創(chuàng)建一個(gè)字段來索引文檔中的關(guān)系名稱, 例如question,answer - 它還為每個(gè)
parent/child關(guān)系創(chuàng)建一個(gè)字段, 例如"my_join_field#question", 如果該文檔為parent-doc:question則為自身_id, 如果該文檔為child-doc:answer則_id為鏈接到父文檔。
GET my-index-000001/_search { "query": { "parent_id": { "type": "answer", "id": "1" } }, "aggs": { "parents": { "terms": { "field": "my_join_field#question", "size": 10 } } }, "runtime_mappings": { "parent": { "type": "long", "script": """ emit(Integer.parseInt(doc['my_join_field#question'].value)) """ } }, "fields": [ { "field": "parent" } ] } -
- mapping定義,