elasticsearch的object型別和動態對映
我們需要討論的最後一個自然JSON資料型別是物件(object)——在其它語言中叫做hash、hashmap、dictionary 或者 associative array.
內部物件(inner objects)經常用於在另一個物件中嵌入一個實體或物件。例如,做為在tweet
文件中user_name
和user_id
的替代,我們可以這樣寫:
{
"tweet": "Elasticsearch is very flexible",
"user": {
"id": "@johnsmith",
"gender": "male",
"age": 26,
"name": {
"full": "John Smith",
"first": "John",
"last": "Smith"
}
}
}
內部物件的對映
Elasticsearch 會動態的檢測新物件的欄位,並且對映它們為 object
型別,將每個欄位加到 properties
欄位下
{
"gb": {
"tweet": { <1>
"properties": {
"tweet": { "type": "string" },
"user": { <2>
"type": "object",
"properties": {
"id": { "type": "string" },
"gender": { "type": "string" },
"age": { "type": "long" },
"name": { <3>
"type": "object",
"properties": {
"full": { "type": "string" },
"first": { "type": "string" },
"last": { "type": "string" }
}
}
}
}
}
}
}
}
<1> 根物件.
<2><3> 內部物件.
對user
和name
欄位的對映與tweet
型別自己很相似。事實上,type
對映只是object
對映的一種特殊型別,我們將 object
稱為根物件。它與其他物件一模一樣,除非它有一些特殊的頂層欄位,比如 _source
,_all
等等。
內部物件是怎樣被索引的
Lucene 並不瞭解內部物件。 一個 Lucene 檔案包含一個鍵-值對應的扁平表單。 為了讓 Elasticsearch 可以有效的索引內部物件,將檔案轉換為以下格式:
{
"tweet": [elasticsearch, flexible, very],
"user.id": [@johnsmith],
"user.gender": [male],
"user.age": [26],
"user.name.full": [john, smith],
"user.name.first": [john],
"user.name.last": [smith]
}
內部欄位可被歸類至name,例如"first"
。 為了區別兩個擁有相同名字的欄位,我們可以使用完整路徑,例如"user.name.first"
或甚至型別
名稱加上路徑:"tweet.user.name.first"
。
注意: 在以上扁平化檔案中,並沒有欄位叫作user
也沒有欄位叫作user.name
。 Lucene 只索引階層或簡單的值,而不會索引複雜的資料結構。
動態對映
當 Elasticsearch 處理一個位置的欄位時,它通過【動態對映】來確定欄位的資料型別且自動將該欄位加到型別對映中。
有時這是理想的行為,有時卻不是。或許你不知道今後會有哪些欄位加到文件中,但是你希望它們能自動被索引。或許你僅僅想忽略它們。特別是當你使用 Elasticsearch 作為主資料來源時,你希望未知欄位能丟擲一個異常來警示你。
幸運的是,你可以通過 dynamic
設定來控制這些行為,它接受下面幾個選項:
true
:自動新增欄位(預設)
false
:忽略欄位
strict
:當遇到未知欄位時丟擲異常
dynamic
設定可以用在根物件或任何 object
物件上。你可以將 dynamic
預設設定為 strict
,而在特定內部物件上啟用它:
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic": "strict", <1>
"properties": {
"title": { "type": "string"},
"stash": {
"type": "object",
"dynamic": true <2>
}
}
}
}
}
<1> 當遇到未知欄位時,my_type
物件將會丟擲異常
<2> stash
物件會自動建立欄位
通過這個對映,你可以新增一個新的可搜尋欄位到 stash
物件中:
PUT /my_index/my_type/1
{
"title": "This doc adds a new field",
"stash": { "new_field": "Success!" }
}
但是在頂層做同樣的操作則會失敗:
PUT /my_index/my_type/1
{
"title": "This throws a StrictDynamicMappingException",
"new_field": "Fail!"
}
備註:將 dynamic
設定成 false
完全不會修改 _source
欄位的內容。_source
將仍舊保持你索引時的完整 JSON 文件。然而,沒有被新增到對映的未知欄位將不可被搜尋。
相關文章
- elasticsearch的字串動態對映Elasticsearch字串
- 聊聊elasticsearch7.8的模板和動態對映Elasticsearch
- TypeScript 對映型別TypeScript型別
- ElasticSearch - 基礎概念和對映Elasticsearch
- ElasticSearch中的對映Elasticsearch
- TypeScript 之對映型別TypeScript型別
- Generic:型別和值之間的對映 (轉)型別
- MyBatis框架之SQL對映和動態SQLMyBatis框架SQL
- EF:自定義Oracle的對映型別Oracle型別
- TypeScript 中令人迷惑的物件型別:Object、{} 和 objectTypeScript物件型別Object
- EF:oracle的number型別對映為C#的boolean型別Oracle型別C#Boolean
- 如何使用Java泛型對映不同的值型別Java泛型型別
- Guru of the week:#17 型別對映. (轉)型別
- SAP SEGW 事物碼裡的 ABAP 型別和 EDM 型別對映的一個具體例子型別
- Elasticsearch 索引的對映配置詳解Elasticsearch索引
- 搞懂 TypeScript 中的對映型別(Mapped Types)TypeScript型別APP
- Hibernate 對映xml中的屬性型別XML型別
- EntityFramework Core如何對映動態模型?Framework模型
- 淺談程式語言型別的強型別,弱型別,動態型別,靜態型別型別
- HIBERNATE的自定義型別主鍵的對映??型別
- C# 4.0中的動態型別和動態程式設計C#型別程式設計
- JavaScript引用型別-Object型別JavaScript型別Object
- 動態賦值弱型別值物件--Dynamic Create Value Object 模式 (轉)賦值型別物件Object模式
- [Hibernate求助]如何構造自己的對映型別?型別
- Docker 如何動態修改容器埠對映Docker
- Js比較對Object型別進行排序JSObject型別排序
- Nginx配置靜態代理/靜態資源對映時root與alias的區別,帶字首對映用aliasNginx
- TypeScript 官方手冊翻譯計劃【十】:型別操控-對映型別TypeScript型別
- Redis - 資料型別對映底層結構Redis資料型別
- Sybase datetime型別對映為Oracle timestamp型別Oracle
- 【ASP.NET Core】動態對映MVC路由ASP.NETMVC路由
- NDK 知識梳理(3) JNI 之 Java 和 JNI 資料型別對映Java資料型別
- C# 中的動態型別C#型別
- C的動態型別檢查型別
- Elasticsearch第四篇:索引別名、新增或修改對映規則Elasticsearch索引
- 引用型別之Object型別Object
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- 本地方法怎麼對映Java層的資料型別Java資料型別