Elasticsearch基礎05——字段類型

關於版本

內容 版本
Elasticsearch版本 7.2.0

之前介紹了Elasticsearch關於數據結構的介紹,這裏主要介紹下Elasticsearch對於數據類型的定義。

Elasticsearch 數據類型

Elasticsearch整體將數據劃分爲:

  • 核心數據類型
  • 複雜數據類型
  • 地理數據類型
  • 專業數據類型
  • 數組
  • 多字段

核心數據類型

字符串

字符串在之前的版本主要指的是string類型。但是在5.X版本已經不支持string類型。其被textkeyword類型替代

text

text字段需要被全文搜索的內容,它可以保存非常長的內容。查詢的時候一般使用分詞器器進⾏行行分詞然後進行全文搜索。text類型的字段不用於排序,很少用於聚合。

keyword

此字段不能使用分詞器進行查詢,只能搜索該字段的完整的值。所以其主要保存一些可以索引的結構化內容。此字段可以進行排序、聚合等操作。

數值類型

整數

  • long
  • intege
  • short
  • byte

浮點

  • double
  • float
  • half_float
  • scaled_float

布爾

  • boolean

數值類型和布爾類型都很簡單這裏不再介紹


範圍

範圍類型主要有下面幾種。

  • integer_range
  • float_range
  • long_range
  • double_range
  • date_range

範圍類型,並不是表示一個具體的數值,它表示個範圍。比如某樣產品工作溫度爲10度至50度就可以使用這種類型表示。

比如我們這是工作溫度(work)爲10度到50度。那麼值可以是 {"gte" : 10, "lte" : 50},那麼我們搜索工作溫度在30攝氏度的產品可以使用"term" : {"work": 30}

日期

  • date

Elasticsearch通過解析字符串是否符合給定的format定義來判斷是否爲date類型。Elasticsearch提供了下面的方式對字符串進行時間的格式化

日期格式的字符串

“2022-01-01” “2022/01/01 12:10:30” 這種字符串串格式

long類型

從1970年年1⽉月1⽇日0點開始的毫秒數

integer

從1970年年1⽉月1⽇日0點開始的秒數

二進制

  • binary

該類型字段會用base64來表示索引中存儲的二進制數據。例如圖片等信息。默認情況下,該類型的字段只是存儲不索引且不可搜索。

複雜數據類型

對象

  • object

對象類型中可以出現對象嵌套對象,比如下面的層級

{
    "name": "jong",
    "age": "27",
    "tel": "13477777777",
    "array": [
        "one",
        "two"
    ],
    "address": {
        "region": "China",
        "location": {
            "province": "HuBei",
            "city": "WuHan"
        }
    }
}

針對這種層級關係的數據我們在進行查詢的時候需要指明其具體層級下的屬性名稱,比如

"address.region": "China",
"address.location.province": "HuBei",
"address.location.city": "WuHan"

嵌套類型

  • nested

是ES對對象數組設置的類型,它可以對對象數組進行索引。

我們插入一個這樣的數據。

{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

最後可以得到一個類似這樣的結果

{
  "group" :        "fans",
  "user.first" : [ "alice", "john" ],
  "user.last" :  [ "smith", "white" ]
}

地理數據類型

座標

  • geo_point

主要保存地理經緯度的信息。其數據保存後的結果是下面樣子

{
    "query": {
        "geo_bounding_box": {
            "location": {
                "top_left": {
                    "lat": 42,
                    "lon": -72
                },
                "bottom_right": {
                    "lat": 40,
                    "lon": -74
                }
            }
        }
    }
}

地理地圖

  • geo_shape

它允許我們使用形狀來做查詢,而不僅僅是座標點。他允許你針對某個座標點進行範圍查詢

{
    "query": {
        "geo_shape": {
            "location": {
                "shape": {
                    "type": "circle",
                    "radius": "1km",
                    "coordinates": [
                        114.405638,
                        30.477114
                    ]
                }
            }
        }
    }
}

專業數據類型

專業數據類型平時很少被使用,其誕生也是爲了解決一部分業務場景的問題。所以很多時候我們並沒有怎麼了解他們,但是在某些特殊場景,這些數據類型卻能很好解決問題。

ip類型

ip類型的字段本質上是一個長整型的字段,用來存儲IPv4或者IPv6的地址

{
    "query": {
        "term": {
            "ip_addr": "192.168.0.0/16"
        }
    }
}

範圍類型

令牌

類型字段token_count實際上是一個integer接受字符串值,對其進行分析,然後爲字符串中的令牌數編制索引的字段。

目前本人還沒搞明白具體使用場景就不細講了

murmur3

mapper-murmur3插件提供了在索引時計算字段值的哈希並將其存儲在索引中的功能

Percolator

可以保存查詢JSON的一個字段類型,可以保存之前設置的查詢語句。

Join

可以在一個索引下,定義父子關係,然後實現類似關係型數據庫中的多表關聯查詢。

等級特徵 Rank feature

一種記錄數據點擊特徵的字段,通過這個字段可以嘗試對數據點擊率進行分析。

等級特徵 Rank features

一種記錄數據點擊特徵的字段,通過這個字段可以嘗試對數據點擊率進行分析。類似於rank_feature數據類型,但更適合於特徵列表稀疏的情況。

Dense vector

一個dense_vector字段存儲浮點值的密集向量。

Sparse vector

一個sparse_vector字段存儲浮點值的稀疏向量。

Search-as-you-type

一種開箱即用的搜索即可見的解決方案,內部會自動拆分爲多個子字段索引

Alias

爲現有字段定義別名。

Flattened

默認情況下,對象中的每個子字段都分別進行映射和索引。flattened類型其中將整個對象映射爲單個字段。給定一個對象,flattened映射將解析出其葉子值,並將它們作爲關鍵字索引到一個字段中。然後可以通過簡單的查詢和聚合來搜索對象的內容。

Shape

它可用於索引和查詢其座標屬於二維平面座標系的幾何

數組

ElasticSearch中,任何一個字段都可以包含0或多個值,這就意味着每個字段其實都可以認爲是數組類型。不過ElasticSearch也要求,每個元素值的數據類型必須相同

正確的數據

  • 字符串串數組 [ “one”, “two” ]
  • 整數數組 [ 1, 2 ]
  • Object對象數組 [ { “name”: “Louis”, “age”: 18 }, { “name”: “Daniel”, “age”: 17 }]

錯誤的數據

[ “one”, “two”, 1, 2 ]


個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章