溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

elasticsearch 5.x數(shù)據(jù)類型與映射的介紹

發(fā)布時間:2021-07-05 15:05:29 來源:億速云 閱讀:264 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“elasticsearch 5.x數(shù)據(jù)類型與映射的介紹”,在日常操作中,相信很多人在elasticsearch 5.x數(shù)據(jù)類型與映射的介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”elasticsearch 5.x數(shù)據(jù)類型與映射的介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    在前面的文章中,我們創(chuàng)建了索引為bank的文檔結(jié)構(gòu),但是,在創(chuàng)建1000個文檔的時候,并沒有指出他們每個屬性的數(shù)據(jù)類型。在沒有數(shù)據(jù)類型映射定義的情況下創(chuàng)建文檔,這在ES中是允許的,因?yàn)镋S會幫我們自動映射數(shù)據(jù)類型。但是,在我們的項(xiàng)目中,必須要先定義文檔的數(shù)據(jù)類型,再操作文檔,因?yàn)槲覀冃枰鶕?jù)業(yè)務(wù)的需要,指定數(shù)據(jù)的屬性,例如,是否需要全文索引,是否需要分詞,分詞器是什么。

    下面我們看下索引bank自動創(chuàng)建文檔數(shù)據(jù)類型映射成什么?

{
  "bank": {
    "mappings": {
      "account": {
        "properties": {
          "account_number": {
            "type": "long"
          },
          "address": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "age": {
            "type": "long"
          },
          "balance": {
            "type": "long"
          },
          "city": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "email": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "employer": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "firstname": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "gender": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "lastname": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "state": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

 上面通過type指定了數(shù)據(jù)的類型。接下來,我們將開始認(rèn)識這些數(shù)據(jù)類型

一、數(shù)據(jù)類型

字段類型概述

一級分類二級分類具體類型
核心類型字符串類型text,keyword
 整數(shù)類型integer,long,short,byte
 浮點(diǎn)類型double,float,half_float,scaled_float
 邏輯類型boolean
 日期類型date
 范圍類型range
 二進(jìn)制類型binary
復(fù)合類型數(shù)組類型array
 對象類型object
 嵌套類型nested
地理類型地理坐標(biāo)類型geo_point
 地理地圖geo_shape
特殊類型IP類型ip
 范圍類型completion
 令牌計(jì)數(shù)類型token_count
 附件類型attachment
 抽取類型percolator

1、字符串類型


  text 類型:當(dāng)一個字段是要被全文搜索的,比如Email內(nèi)容、產(chǎn)品描述,應(yīng)該使用text類型。設(shè)置text類型以后,字段內(nèi)容會被分析,在生成倒排索引以前,字符串會被分析器分成一個一個詞項(xiàng)。text類型的字段不用于排序,很少用于聚合。
  keyword:keyword類型適用于索引結(jié)構(gòu)化的字段,比如email地址、主機(jī)名、狀態(tài)碼和標(biāo)簽。如果字段需要進(jìn)行過濾(比如查找已發(fā)布博客中status屬性為published的文章)、排序、聚合。keyword類型的字段只能通過精確值搜索到。

2、整數(shù)類型

類型取值范圍
byte-128~127
short-32768~32767
integer-231~231-1
short-263~263-1

在滿足需求的情況下,盡可能選擇范圍小的數(shù)據(jù)類型。比如,某個字段的取值最大值不會超過100,那么選擇byte類型即可。迄今為止吉尼斯記錄的人類的年齡的最大值為134歲,對于年齡字段,short足矣。字段的長度越短,索引和搜索的效率越高。

3、浮點(diǎn)類型

類型取值范圍
doule64位雙精度IEEE 754浮點(diǎn)類型
float32位單精度IEEE 754浮點(diǎn)類型
half_float16位半精度IEEE 754浮點(diǎn)類型
scaled_float縮放類型的的浮點(diǎn)數(shù)

對于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
優(yōu)先考慮使用帶縮放因子的scaled_float浮點(diǎn)類型。

4、date類型

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

5、boolean類型 true和false

6、 binary類型

進(jìn)制字段是指用base64來表示索引中存儲的二進(jìn)制數(shù)據(jù),可用來存儲二進(jìn)制形式的數(shù)據(jù),例如圖像。默認(rèn)情況下,該類型的字段只存儲不索引。二進(jìn)制類型只支持index_name屬性。

7、array類型

(1)字符數(shù)組: [ “one”, “two” ]
(2)整數(shù)數(shù)組: productid:[ 1, 2 ]
(3)對象(文檔)數(shù)組: “user”:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }],
注意:lasticSearch不支持元素為多個數(shù)據(jù)類型:[ 10, “some string” ]

8、 object類型

JSON對象,文檔會包含嵌套的對象

9、ip類型

p類型的字段用于存儲IPv4或者IPv6的地址

二、Mapping 支持屬性

下面解釋下一些重要的映射屬性

index

設(shè)置此字段能不能被查詢,就是決定要不要將這個字段放進(jìn)倒排索引裡

若index設(shè)置為true(默認(rèn)是true),則表示這個這個字段會被放進(jìn)倒排索引裡,如果是text就是分詞過后放進(jìn)索引,如果是keyword、integer...就直接整段放進(jìn)索引裡

若index設(shè)置為false,則表示這個字段不放進(jìn)倒排索引裡,因此不能查詢這個字段(因?yàn)樗淮嬖谟诘古潘饕e)

通常這種被設(shè)成false的字段,可以想像成是屬于一種附屬的字段,就是不能被match、term查詢,但是當(dāng)該文檔被其他搜索條件搜出來時,他可以附帶的一起被找出來,因?yàn)樗麄兺瑢儆谕粋€文檔。

舉個例子,定義user索引的映射

PUT /user
{
	"mappings": {
		"doc": {
			"properties": {
				"name": {
					"type": "keyword",
					"index": false
				},
				"uid": {
					"type": "integer"
				},
				"nickname": {
					"type": "text",
					"analyzer": "standard"
				}
			}
		}
	}
}

當(dāng)搜索uid時,name會一起被找出來

/user/_search
{
    "query": {
        "term": {
            "uid": 1
        }
    }
}

如果搜索name屬性,將會報錯

GET /user/_search
{
    "query": {
        "term": {
            "name": "hugo"
        }
    }
}

出錯信息如下

          "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Cannot search on field [name] since it is not indexed."
          }

analyzer

主要用在text類型的字段上,就是設(shè)定要使用哪種分詞器來建立索引

可以使用內(nèi)建的分詞器,或是使用自定義的分詞器

可以使用/_analyze測試分析器具體會將句子分詞成什么樣子,它能幫助我們理解Elasticsearch索引內(nèi)部發(fā)生了什么

GET 127.0.0.1:9200/_analyze
{
    "analyzer": "standard",
    "text": "Text to analyze"
}

boost

官方建議:index time boost is deprecated. Instead, the field mapping boost is applied at query time. 
也就是說,官方推薦在查詢時指定boost。

我們可以通過指定一個boost值來控制每個查詢子句的相對權(quán)重,該值默認(rèn)為1。一個大于1的boost會增加該查詢子句的相對權(quán)重。boost參數(shù)被用來增加一個子句的相對權(quán)重(當(dāng)boost大于1時),或者減小相對權(quán)重(當(dāng)boost介于0到1時),但是增加或者減小不是線性的。換言之,boost設(shè)為2并不會讓最終的_score加倍。

POST /bank/_search?pretty
{
    "query": {
        "match" : {
            "address": {
                "query": "mill",
                "boost": 2
            }
        }
    }
}

查詢結(jié)果

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 8.620199,
    "hits": [
      {
        "_index": "bank",
        "_type": "account",
        "_id": "472",
        "_score": 8.620199,
        "_source": {
          "account_number": 472,
          "balance": 25571,
          "firstname": "Lee",
          "lastname": "Long",
          "age": 32,
          "gender": "F",
          "address": "288 Mill Street",
          "employer": "Comverges",
          "email": "leelong@comverges.com",
          "city": "Movico",
          "state": "MT"
        }
      },
      {
        "_index": "bank",
        "_type": "account",
        "_id": "136",
        "_score": 8.532413,
        "_source": {
          "account_number": 136,
          "balance": 45801,
          "firstname": "Winnie",
          "lastname": "Holland",
          "age": 38,
          "gender": "M",
          "address": "198 Mill Lane",
          "employer": "Neteria",
          "email": "winnieholland@neteria.com",
          "city": "Urie",
          "state": "IL"
        }
      },
      {
        "_index": "bank",
        "_type": "account",
        "_id": "970",
        "_score": 7.723722,
        "_source": {
          "account_number": 970,
          "balance": 19648,
          "firstname": "Forbes",
          "lastname": "Wallace",
          "age": 28,
          "gender": "M",
          "address": "990 Mill Road",
          "employer": "Pheast",
          "email": "forbeswallace@pheast.com",
          "city": "Lopezo",
          "state": "AK"
        }
      },
      {
        "_index": "bank",
        "_type": "account",
        "_id": "345",
        "_score": 7.723722,
        "_source": {
          "account_number": 345,
          "balance": 9812,
          "firstname": "Parker",
          "lastname": "Hines",
          "age": 38,
          "gender": "M",
          "address": "715 Mill Avenue",
          "employer": "Baluba",
          "email": "parkerhines@baluba.com",
          "city": "Blackgum",
          "state": "KY"
        }
      }
    ]
  }
}

三、更新映射

當(dāng)首次創(chuàng)建一個索引的時候,可以指定類型的映射,但假設(shè)后來想要增加一個新的映射字段,可以使用/_mapping把新的字段加進(jìn)mapping映射裡

可以增加一個新的映射,但是不能修改存在的映射,原因是因?yàn)檫@個映射可能有文檔去用,如果改了映射的類型,可能會導(dǎo)致索引的數(shù)據(jù)出錯,因此只能新加字段進(jìn)去,不能修改

具體實(shí)例

在user映射中的doc類型增加一個新的名為tag的keyword
 

PUT /user/_mapping/doc
{
    "properties": {
        "tag": {
            "type": "keyword",
        }
    }
}

到此,關(guān)于“elasticsearch 5.x數(shù)據(jù)類型與映射的介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI