1. 程式人生 > >ElasticSearch 6.x 學習筆記:12.欄位型別

ElasticSearch 6.x 學習筆記:12.欄位型別

12.1 欄位型別概述

一級分類 二級分類 具體型別
核心型別 字串型別 string,text,keyword
整數型別 integer,long,short,byte
浮點型別 double,float,half_float,scaled_float
邏輯型別 boolean
日期型別 date
範圍型別 range
二進位制型別 binary
複合型別 陣列型別 array
物件型別 object
巢狀型別 nested
地理型別 地理座標型別 geo_point
地理地圖 geo_shape
特殊型別 IP型別 ip
範圍型別 completion
令牌計數型別 token_count
附件型別 attachment
抽取型別 percolator

12.2 字串型別

(1)string
string型別在ElasticSearch 舊版本中使用較多,從ElasticSearch 5.x開始不再支援string,由text和keyword型別替代。
(2)text
當一個欄位是要被全文搜尋的,比如Email內容、產品描述,應該使用text型別。設定text型別以後,欄位內容會被分析,在生成倒排索引以前,字串會被分析器分成一個一個詞項。text型別的欄位不用於排序,很少用於聚合。
(3)keyword
keyword型別適用於索引結構化的欄位,比如email地址、主機名、狀態碼和標籤。如果欄位需要進行過濾(比如查詢已釋出部落格中status屬性為published的文章)、排序、聚合。keyword型別的欄位只能通過精確值搜尋到。

12.3 整數型別

型別 取值範圍
byte -128~127
short -32768~32767
integer -231~231-1
long -263~263-1

在滿足需求的情況下,儘可能選擇範圍小的資料型別。比如,某個欄位的取值最大值不會超過100,那麼選擇byte型別即可。迄今為止吉尼斯記錄的人類的年齡的最大值為134歲,對於年齡欄位,short足矣。欄位的長度越短,索引和搜尋的效率越高。

12.4 浮點型別

型別 取值範圍
doule 64位雙精度IEEE 754浮點型別
float 32位單精度IEEE 754浮點型別
half_float 16位半精度IEEE 754浮點型別
scaled_float 縮放型別的的浮點數

對於float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查詢查詢-0.0不會匹配+0.0,同樣range查詢中上邊界是-0.0不會匹配+0.0,下邊界是+0.0不會匹配-0.0。

其中scaled_float,比如價格只需要精確到分,price為57.34的欄位縮放因子為100,存起來就是5734
優先考慮使用帶縮放因子的scaled_float浮點型別。

12.5 date型別

我們人類使用的計時系統是相當複雜的:秒是基本單位, 60秒為1分鐘, 60分鐘為1小時, 24小時是一天……如果計算機也使用相同的方式來計時, 那顯然就要用多個變數來分別存放年月日時分秒, 不停的進行進位運算, 而且還要處理偶爾的閏年和閏秒以及協調不同的時區. 基於”追求簡單”的設計理念, UNIX在內部採用了一種最簡單的計時方式:

計算從UNIX誕生的UTC時間1970年1月1日0時0分0秒起, 流逝的秒數. 
UTC時間1970年1月1日0時0分0秒就是UNIX時間0, UTC時間1970年1月2日0時0分0秒就是UNIX時間86400. 
這個計時系統被所有的UNIX和類UNIX系統繼承了下來, 而且影響了許多非UNIX系統.  

日期型別表示格式可以是以下幾種:
(1)日期格式的字串,比如 “2018-01-13” 或 “2018-01-13 12:10:30”
(2)long型別的毫秒數( milliseconds-since-the-epoch,epoch就是指UNIX誕生的UTC時間1970年1月1日0時0分0秒)
(3)integer的秒數(seconds-since-the-epoch)

ElasticSearch 內部會將日期資料轉換為UTC,並存儲為milliseconds-since-the-epoch的long型整數。
例子:日期格式資料
(1)建立索引

DELETE test

PUT test
{
  "mappings":{
    "my":{
      "properties": {
        "postdate":{
          "type":"date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

(2)寫入文件

PUT test/my/1
{
  "postdate":"2018-01-13"
}
PUT test/my/2
{
  "postdate":"2018-01-01 00:01:05"
}
PUT test/my/3
{
  "postdate":"1420077400001"
}

(3)批量查詢

GET test/my/_mget
{
  "ids":["1","2","3"]
}
{
  "docs": [
    {
      "_index": "test",
      "_type": "my",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "postdate": "2018-01-13"
      }
    },
    {
      "_index": "test",
      "_type": "my",
      "_id": "2",
      "_version": 1,
      "found": true,
      "_source": {
        "postdate": "2018-01-01 00:01:05"
      }
    },
    {
      "_index": "test",
      "_type": "my",
      "_id": "3",
      "_version": 2,
      "found": true,
      "_source": {
        "postdate": "1420077400001"
      }
    }
  ]
}

12.6 boolean型別

邏輯型別(布林型別)可以接受true/false/”true”/”false”值
(1)先刪除已經存在的索引,再建立

DELETE test

PUT test
{
  "mappings":{
    "my":{
      "properties": {
        "empty":{"type":"boolean"}
      }
    }
  }
}

(2)新增文件

PUT test/my/1
{
  "empty":"true"
}

PUT test/my/2
{
  "empty":false
}

(3)檢視文件

GET test/my/_mget
{
  "ids":["1","2"]
}
{
  "docs": [
    {
      "_index": "test",
      "_type": "my",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "empty": "true"
      }
    },
    {
      "_index": "test",
      "_type": "my",
      "_id": "2",
      "_version": 1,
      "found": true,
      "_source": {
        "empty": false
      }
    }
  ]
}

12.7 binary型別

二進位制欄位是指用base64來表示索引中儲存的二進位制資料,可用來儲存二進位制形式的資料,例如影象。預設情況下,該型別的欄位只儲存不索引。二進位制型別只支援index_name屬性。

12.7 array型別

在ElasticSearch中,沒有專門的陣列(Array)資料型別,但是,在預設情況下,任意一個欄位都可以包含0或多個值,這意味著每個欄位預設都是陣列型別,只不過,陣列型別的各個元素值的資料型別必須相同。在ElasticSearch中,陣列是開箱即用的(out of box),不需要進行任何配置,就可以直接使用。

在同一個陣列中,陣列元素的資料型別是相同的,ElasticSearch不支援元素為多個數據型別:[ 10, “some string” ],常用的陣列型別是:

(1)字元陣列: [ “one”, “two” ]
(2)整數陣列: productid:[ 1, 2 ]
(3)物件(文件)陣列: “user”:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }],ElasticSearch內部把物件陣列展開為 {“user.name”: [“Mary”, “John”], “user.age”: [12,10]}

12.8 object型別

JSON天生具有層級關係,文件會包含巢狀的物件

DELETE test

PUT test

PUT test/my/1
{
  "employee":{
    "age":30,
    "fullname":{
      "first":"hadron",
      "last":"cheng"
    }
  }
}

上面文件整體是一個JSON,JSON中包含一個employee,employee又包含一個fullname。


GET test/_mapping
{
  "test": {
    "mappings": {
      "my": {
        "properties": {
          "employee": {
            "properties": {
              "age": { "type": "long"},
              "fullname": {
                "properties": {
                  "first": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "last": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

12.9 ip型別

ip型別的欄位用於儲存IPv4或者IPv6的地址
(1)建立索引

DELETE test

PUT test
{
  "mappings": {
    "my":{
      "properties": {
        "nodeIP":{
          "type": "ip"
        }
      }
    }
  }
}

(2)查詢欄位

GET test/_search
{
  "query": {
    "term": {
      "nodeIP": "192.168.0.0/16"
    }
  }
}
{
  "took": 111,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "test",
        "_type": "my",
        "_id": "1",
        "_score": 1,
        "_source": {
          "nodeIP": "192.168.1.2"
        }
      }
    ]
  }
}

相關推薦

ElasticSearch 6.x 學習筆記12.型別

12.1 欄位型別概述 一級分類 二級分類 具體型別 核心型別 字串型別 string,text,keyword 整數型別 integer,long,

ElasticSearch 6.x 學習筆記6.索引

6.1 建立索引 (1)簡單方式 PUT test { "acknowledged": true, "shards_acknowledged": true, "index": "t

ElasticSearch 6.x 學習筆記15.檢索入門

15.1 準備資料 [es@node1 ~]$ vi website.json [es@node1 ~]$ cat website.json { "index":{ "_index": "website", "_type": "blog", "_id"

ElasticSearch 6.x 學習筆記2.head外掛

2.1 Head外掛簡介 ElasticSearch-head是一個H5編寫的ElasticSearch叢集操作和管理工具,可以對叢集進行傻瓜式操作。 顯示叢集的拓撲,並且能夠執行索引和節點級別操作 搜尋介面能夠查詢叢集中原始json或表格格式的檢索資料

ElasticSearch 6.x 學習筆記31.Java API之詞項查詢

1、term查詢 Find documents which contain the exact term specified in the field specified. package cn.hadron; import cn.hadron.

ElasticSearch 6.x 學習筆記7.文件

7.1 新建文件 index/type/id1 (1)一般格式 PUT blog/csdn/1 { "id":1, "title":"Elastic

ElasticSearch 6.x 學習筆記20.搜尋排序

20.1 按照文件新增順序排序 GET website/_search GET website/_search { "query": { "match_all": {} } }

Spark2.x學習筆記6、在Windows平臺下搭建Spark開發環境(Intellij IDEA)

Spark2.x學習筆記 6、 在Windows平臺下搭建Spark開發環境(Intellij IDEA+Maven) 6.1 整合開發環境IDE 為了方便應用程式開發與測試,提高開發效率,一般使用整合開發工具IDE。同樣,為了方便Spark應用程式編

LogStash官方文件6.x學習筆記---------day1

上個星期之前看過一段時間,對logstash基礎有一定了解。現在來好好記錄一下我的學習的東西。 logstash的工作流程:    由input--->filter---->output構成。 執行模型: Logstash事件處理管道協調input--

Spark2.x學習筆記3、 Spark核心概念RDD

Spark學習筆記:3、Spark核心概念RDD 3.1 RDD概念 彈性分散式資料集(Resilient Distributed Datasets,RDD) ,可以分三個層次來理解: 資料集:故名思議,RDD 是資料集合的抽象,是複雜物理介質上存在資料的一種邏輯檢視。

Spark2.x學習筆記2、Scala簡單例子

2、 Scala簡單例子2.1 互動式程式設計spark-shell是Spark互動式執行模式,提供了互動式程式設計,邊敲程式碼邊執行,不需要建立程式原始檔,方便除錯程式,有利於快速學習Spark。[[email protected] spark-2.2.0]# bin/spark-shell U

Spark2.x學習筆記14、Spark SQL程式設計

Spark2.x學習筆記:14、 Spark SQL程式設計 14.1 RDD的侷限性 RDD僅表示資料集,RDD沒有元資料,也就是說沒有欄位語義定義。 RDD需要使用者自己優化程式,對程式設計師要求較高。 從不同資料來源讀取資料相對困難。 合併多個數

作業系統精髓與設計原理(原書第6版)——學習筆記12

 3.2.3 五狀態模型 如果所有程序都做好了執行準備,則圖3.5b所給出的排隊規則是有效的。佇列是“先進先出”(FIFO)的表,對於可執行的程序處理器以一種輪轉方式操作(依次給佇列中的每個程

Cocos2d-x 3.x學習筆記猩先生帶你打飛機(四)遊戲場景:背景與我機的建立、敵機的建立、物理世界構建

一、背景與我機的建立 現在我們要建立新的一個場景了。選擇開始遊戲即從選單場景跳到遊戲場景。現在先完善HelloWorldScene的程式碼 找到我們開始遊戲的回撥方法,新增程式碼: //開始遊戲 void HelloWorld::menuStartCa

ES[7.6.x]學習筆記(七)IK中文分詞器

在上一節中,我們給大家介紹了ES的分析器,我相信大家對ES的全文搜尋已經有了深刻的印象。分析器包含3個部分:字元過濾器、分詞器、分詞過濾器。在上一節的例子,大家發現了,都是英文的例子,是吧?因為ES是外國人寫的嘛,中國如果要在這方面趕上來,還是需要螢幕前的小夥伴們的~ 英文呢,我們可以按照空格將一句話、一

ES[7.6.x]學習筆記(八)資料的增刪改

在前面幾節的內容中,我們學習索引、欄位對映、分析器等,這些都是使用ES的基礎,就像在資料庫中建立表一樣,基礎工作做好以後,我們就要真正的使用它了,這一節我們要看看怎麼向索引裡寫入資料、修改資料、刪除資料,至於搜尋嘛,因為ES的主要功能就是搜尋,所以搜尋的相關功能我們後面會展開講。 ## Document的建

ES[7.6.x]學習筆記(九)搜尋

搜尋是ES最最核心的內容,沒有之一。前面章節的內容,索引、動態對映、分詞器等都是鋪墊,最重要的就是最後點選搜尋這一下。下面我們就看看點選搜尋這一下的背後,都做了哪些事情。 ## 分數(score) ES的搜尋結果是按照相關分數的高低進行排序的,咦?! 怎麼沒說搜尋先說搜尋結果的排序了?咱們這裡先把這個概念

ES[7.6.x]學習筆記(十一)與SpringBoot結合

在前面的章節中,我們把ES的基本功能都給大家介紹完了,從ES的搭建、建立索引、分詞器、到資料的查詢,大家發現,我們都是通過ES的API去進行呼叫,那麼,我們在專案當中怎麼去使用ES呢?這一節,我們就看看ES如何與我們的SpringBoot專案結合。 ## 版本依賴 SpringBoot預設是有Elasti

ES[7.6.x]學習筆記(十二)高亮 和 搜尋建議

ES當中大部分的內容都已經學習完了,今天呢算是對前面內容的查漏補缺,把ES中非常實用的功能整理一下,在以後的專案開發中,這些功能肯定是對你的專案加分的,我們來看看吧。 ## 高亮 高亮在搜尋功能中是十分重要的,我們希望搜尋的內容在搜尋結果中重點突出,讓使用者聚焦在搜尋的內容上。我們看看在ES當中是怎麼實現

Javascript高階程式設計學習筆記12)—— 引用型別(1)Object型別

前面的文章中我們知道JS中的值分為兩種型別 基礎型別的值和引用型別的值 基礎型別的值我已經大概介紹了一下,今天開始後面幾天我會為大家介紹一下引用型別的值   Object型別 物件是引用型別的值的例項,在ECMA中引用型別是一種資料結構 用於將資料和功能組織到一起,在其它程式語言中通常也