Elasticsearch 中的每個欄位都有一個欄位資料型別或欄位型別, 此型別指示欄位包含的資料型別(例如字串或布林值)及其預期用途, 例如,你可以將字串索引到文本欄位(text)和關鍵字(keyword)欄位, 這樣做的目的是,將分析文本欄位值以進行全文搜索,而將關鍵字字串保持原樣以進行過濾和排序,
欄位型別按 family 分組, 同一 family 中的型別支持相同的搜索功能,但可能具有不同的空間使用或性能特征,
當前,關鍵字(keyword)family ,它由 keyword,constant_keyword 和 wildcard 型別組成, 其他 familiy 可能只有一個欄位型別, 例如,布爾 family 由一個欄位型別組成:boolean,
有關資料型別的更多描述,可以在官方檔案 找到,在今天的文章中,我們來介紹一些有趣的資料型別,有些我們已經在之前的檔案中介紹過了,
unsigned_long
無符號長整數是一種數字欄位型別,表示無符號的64位整數,最小值為0,最大值為
(從0到18446744073709551615),在 Java 編程中,最大的值為 long.MAX_VALUE = 9,223,372,036,854,775,807 (signed),可以以數字或字串形式匯入無符號長整數,它們表示[0,18446744073709551615]范圍內的整數值, 他們不能有小數部分,
PUT unsigned_long_test
{
"mappings": {
"properties": {
"my_counter": {
"type": "unsigned_long"
}
}
}
}
POST /unsigned_long_test/_bulk?refresh
{"index":{"_id":1}}
{"my_counter": 0}
{"index":{"_id":2}}
{"my_counter": "9223372036854775808"}
{"index":{"_id":3}}
{"my_counter": 18446744073709551614}
{"index":{"_id":4}}
{"my_counter": 18446744073709551615}
我們可以使用如下的例子來進行查詢:
GET unsigned_long_test/_search
{
"query": {
"range": {
"my_counter": {
"gte": 9223372036854775808
}
}
}
}
上面的結果顯示:
"hits" : [
{
"_index" : "unsigned_long_test",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"my_counter" : "9223372036854775808"
}
},
{
"_index" : "unsigned_long_test",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"my_counter" : 18446744073709551614
}
},
{
"_index" : "unsigned_long_test",
"_type" : "_doc",
"_id" : "4",
"_score" : 1.0,
"_source" : {
"my_counter" : 18446744073709551615
}
}
]
}
這個大的數使用于銀行或一些網路通信等需要一個大的 counter,每次交易會自動增加1,當 counter 達到最大值時,自動輪回到 0,這個很大的值不會輕易溢位,
Version
Version 欄位型別是 keyword 欄位的一種特殊形式,用于處理軟體版本值并支持它們的專用優先級規則, 優先級是按照語意版本控制概述的規則定義的,例如,這意味著主要版本,次要版本和補丁版本部分按數字排序(即 “2.1.0” < “2.4.1” < “2.11.2”)并進行預發行 版本在發布版本之前進行排序(即 “1.0.0-alpha” <“ 1.0.0”),
你索引一個 version 欄位,如下所示
PUT version_index
{
"mappings": {
"properties": {
"my_version": {
"type": "version"
}
}
}
}
PUT version_index/_bulk?refresh
{ "index": {} }
{ "my_version": "1.5.0-alpha" }
{ "index": {} }
{ "my_version": "1.2.5" }
{ "index": {} }
{ "my_version": "1.2.5-alpha2" }
{ "index": {} }
{ "my_version": "1.2.5-alpha2.beta" }
{ "index": {} }
{ "my_version": "1.2.5-alpha1" }
{ "index": {} }
{ "my_version": "1.2.5-beta1" }
我們做如下的搜索排序:
GET version_index/_search?filter_path=**.my_version
{
"sort": [
{
"my_version": {
"order": "desc"
}
}
]
}
{
"hits" : {
"hits" : [
{
"_source" : {
"my_version" : "1.5.0-alpha"
}
},
{
"_source" : {
"my_version" : "1.2.5"
}
},
{
"_source" : {
"my_version" : "1.2.5-beta1"
}
},
{
"_source" : {
"my_version" : "1.2.5-alpha2.beta"
}
},
{
"_source" : {
"my_version" : "1.2.5-alpha2"
}
},
{
"_source" : {
"my_version" : "1.2.5-alpha1"
}
}
]
}
}
從上面可以看出來 1.2.5 發布版本比其它的 beta 及 alpha 版本要高,
Flatten
默認情況下,物件中的每個子欄位都分別進行映射和索引, 如果事先不知道子欄位的名稱或型別,則將動態映射它們,
Flatten 型別提供了一種替代方法,其中將整個物件映射為單個欄位, 對于給定的物件,Flatten 的映射將決議出其 leaf 值并將它們作為關鍵字索引到一個欄位中, 然后可以通過簡單的查詢和匯總來搜索物件的內容,
如果你想了解更多,請參閱我之前的文章 “Elasticsearch:flattened 資料型別 (7.3 發行版新功能)”,
作為一個簡單的例子,我們定一個 flattened 型別的索引:
PUT flattened
{
"mappings": {
"properties": {
"labels": {
"type": "flattened"
}
}
}
}
POST flattened/_doc/1
{
"labels": {
"size": "x1",
"color": "red",
"type": "v-neck",
"price": 25,
"last_updated": 1614594536173
}
}
POST flattened/_doc/2?refresh
{
"labels": {
"last_updated": 2
}
}
在上面,我們為 flattened 索引創建了兩個檔案,讓我們做如下的搜索:
GET flattened/_search
{
"query": {
"term": {
"labels.color": "red"
}
}
}
上面回傳資料:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.9530773,
"hits" : [
{
"_index" : "flattened",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.9530773,
"_source" : {
"labels" : {
"size" : "x1",
"color" : "red",
"type" : "v-neck",
"price" : 25,
"last_updated" : 1614594536173
}
}
}
]
}
}
因為所有的欄位都被定義為 keyword,那么 timestamp 為 2 的比 1614594536173 要大,
GET flattened/_search?filter_path=**.last_updated
{
"sort": [
{
"labels.last_updated": {
"order": "desc"
}
}
]
}
上面的結果顯示:
{
"hits" : {
"hits" : [
{
"_source" : {
"labels" : {
"last_updated" : 2
}
}
},
{
"_source" : {
"labels" : {
"last_updated" : 1614594536173
}
}
}
]
}
}
Aggregate metric
為指標聚合存盤預聚合數值, Aggregate_metric_double 欄位是一個物件,其中包含一個或多個以下指標子欄位:min,max,sum 和 value_count,
當你在 aggregate_metric_double 欄位上運行某些指標聚合時,該聚合將使用相關子欄位的值, 例如,aggregate_metric_double欄位上的 min 聚合回傳所有 min 子欄位的最小值,
重要:Aggregate_metric_double 欄位為每個指標子欄位存盤一個數字 doc value, 不支持陣列值, min,max 和 sum 是 double 型別的值, value_count 是一個正整數,
Aggregate_metric_double 欄位的引數
metrics: (必需,字串陣列)要存盤的指標子欄位的陣列, 每個值都對應一個指標聚合, 有效值為 min,max,sum 和 value_count, 你必須至少指定一個值,
default_metric:(必需,字串)默認指標子欄位,用于不使用子欄位的查詢,腳本和聚合, 必須是來自指標陣列的值,
我們先以一個例子來進行說明,首先創建一個叫做 sales_per_day 的索引:
PUT sales_per_day
{
"mappings": {
"properties": {
"agg_metric": {
"type": "aggregate_metric_double",
"metrics": [ "min", "max", "value_count", "sum" ],
"default_metric": "value_count"
}
}
}
}
PUT sales_per_day/_doc/january
{
"agg_metric": {
"min": 13,
"max": 34,
"sum": 4653.00,
"value_count": 234
}
}
PUT sales_per_day/_doc/feburary?refresh
{
"agg_metric": {
"min": 5,
"max": 28,
"sum": 3124.34,
"value_count": 260
}
}
我們接下來可以做如下的搜索:
POST sales_per_day/_search?size=0
{
"aggs": {
"metric_min": {
"min": {
"field": "agg_metric"
}
},
"metric_max": {
"max": {
"field": "agg_metric"
}
},
"metric_value_count": {
"value_count": {
"field": "agg_metric"
}
},
"metric_avg": {
"avg": {
"field": "agg_metric"
}
}
}
}
上面搜索的結果是:
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"metric_avg" : {
"value" : 15.743603238866397
},
"metric_min" : {
"value" : 5.0
},
"metric_max" : {
"value" : 34.0
},
"metric_value_count" : {
"value" : 494
}
}
}
我們可以看到兩個檔案的 max 欄位中最大的值為 34,而最小的值為 5.0,value_count 變成了兩個檔案的 value_count 之合,而它的 metric_avg 其實就是兩個檔案的 sum 值相加,再除以 metric_value_count 的值,
dense_vector
density_vector 欄位存盤浮點值的 dense vectors, 向量中可以包含的最大維數不應超過 2048,density_vector 欄位是單值欄位,
你可以閱讀我之前的文章 “Elasticsearch:基于 Vector 的打分”
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275397.html
標籤:AI
上一篇:JAVA Future類詳解
下一篇:實時 OLAP, 從 0 到 1
