Elasticsearch系列(4)Mapping之字段類型

1. 前言

Mapping(映射)用來(lái)定義文檔包含的字段名裆操、字段數(shù)據(jù)類型以及文檔如何存儲(chǔ)和索引這些字段的規(guī)則,例如妥曲,使用映射來(lái)定義:

  • 哪些字符串字段應(yīng)該作為全文字段(text)處理堡称。
  • 哪些字段包含數(shù)字、日期或地理位置钓株。
  • 日期值的格式。
  • 控制動(dòng)態(tài)添加字段的映射的自定義規(guī)則陌僵。

例如轴合,文章的索引Mapping定義如下:

Mapping既可以是創(chuàng)建索引時(shí)使用,也可以預(yù)先顯式定義碗短。

映射字段種類包括有:

  • 元數(shù)據(jù)字段(Metadata fields)
    元數(shù)據(jù)字段用于定制如何處理與文檔相關(guān)的元數(shù)據(jù)受葛。例如,元數(shù)據(jù)字段包括文檔的_index豪椿、_id和_source字段奔坟。
  • 定義的字段或?qū)傩裕‵ields or properties)
    定義文檔中包括哪些字段或?qū)傩粤斜怼?/li>

2. 字段數(shù)據(jù)類型

索引文檔中的每個(gè)字段都有一個(gè)數(shù)據(jù)類型。既可以是一種簡(jiǎn)單的類型(比如text搭盾、keyword、date婉支、long等)鸯隅,也可以是JSON分層特性的類型或者特殊類型(比如object、nested向挖、geo_point等)蝌以。

同一個(gè)字段如果使用不同的數(shù)據(jù)類型,那么它的意義也是不同的何之,例如跟畅,字符串既可以定義為text字段類型進(jìn)行分析索引,以便進(jìn)行全文搜索溶推,也可以定義為keyword字段類型保持原樣進(jìn)行索引徊件,以便進(jìn)行排序或聚合奸攻。

字段類型按照家族系列分組,同一系列的類型支持相同的搜索功能虱痕,只是可能在性能特性或存儲(chǔ)空間上有所不同睹耐。下面介紹幾種字段類型。

2.1 普通類型

Binary
  • 描述:二進(jìn)制類型部翘,類型值binary硝训。接收一個(gè)Base64編碼的二進(jìn)制值。該類型定義的字段不可搜索新思,且默認(rèn)不存儲(chǔ)窖梁。
  • 操作示例如下:
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "store": false
      },
      "blob": {
        "type": "binary"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "name": "Some binary blob",
  "blob": "U29tZSBiaW5hcnkgYmxvYg=="
}

GET my-index-000001/_doc/1
{
}
  • 支持的類型參數(shù):doc_values(默認(rèn)false)、store(默認(rèn)false)夹囚。
Boolean
  • 描述:布爾類型纵刘,類型值boolean。接受true崔兴、false值彰导,也支持字符串"true"、"false" 或空字符串""敲茄,空字符串表示false位谋。在聚合操作時(shí),返回boolean類型使用1和0作為key堰燎,使用字符串“true”和“false”作為key_as_string掏父。
  • 操作示例如下:

(1)創(chuàng)建索引及索引數(shù)據(jù)

PUT my-index-000002
{"mappings":{"properties":{"is_published":{"type":"boolean"}}}}

POST my-index-000002/_doc/1
{"is_published":true}

POST my-index-000002/_doc/2
{"is_published":"false"}

(2)按照字段is_published聚合:

GET my-index-000002/_search
{"aggs":{"publish_state":{"terms":{"field":"is_published"}}}}

聚合結(jié)果片段如下:

"aggregations" : {
    "publish_state" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 0,
          "key_as_string" : "false",
          "doc_count" : 1
        },
        {
          "key" : 1,
          "key_as_string" : "true",
          "doc_count" : 1
        }
      ]
    }
  }
  • 支持的類型參數(shù):boost(默認(rèn)1.0)、doc_values(默認(rèn)true)秆剪、index(默認(rèn)true)赊淑、null_value(默認(rèn)null)、store(默認(rèn)false)仅讽、meta陶缺,所以在默認(rèn)情況下,該類型字段支持可搜索洁灵,不可存儲(chǔ)饱岸。
Keyword
  • 描述:關(guān)鍵字類型家族,類型值包括keyword徽千、 constant_keyword以及 wildcard苫费。用于索引結(jié)構(gòu)化的內(nèi)容,比如主機(jī)名双抽、狀態(tài)代碼百框、郵政編碼,通常作用于過(guò)濾查找牍汹、排序和聚合操作铐维,但是只能通過(guò)確切的值進(jìn)行搜索柬泽,返回字段值完全匹配的文檔數(shù)據(jù)。
  • 操作示例如下:
PUT my-index-000003
{"mappings":{"properties":{"tags":{"type":"keyword"}}}}

POST my-index-000003/_doc/1
{"tags":"big ball"}

POST my-index-000003/_doc/2
{"tags":"small ball"}

## 通過(guò)確切的值搜索
GET my-index-000003/_search
{"query":{"match":{"tags":"small ball"}}}
  • 支持的類型參數(shù):boost(默認(rèn)1.0)方椎、doc_values(默認(rèn)true)聂抢、eager_global_ordinals(默認(rèn)false)、fields棠众、ignore_above琳疏、 index(默認(rèn)true)、index_options闸拿、norms(默認(rèn)false)空盼、null_value(默認(rèn)null)、similarity(默認(rèn)BM25)新荤、normalizer(默認(rèn)null)揽趾、store(默認(rèn)false)、meta苛骨,所以在默認(rèn)情況下篱瞎,該類型字段支持可搜索,不可存儲(chǔ)痒芝。
Numbers
  • 描述:數(shù)字類型家族俐筋,類型值包括long、 integer严衬、short澄者、byte、double请琳、float粱挡、half_float、scale_float俄精。對(duì)于數(shù)字類型的選擇時(shí)询筏,根據(jù)滿足實(shí)際情況選擇最小的類型,這樣對(duì)于索引和搜索更有效竖慧,但是es存儲(chǔ)是基于存儲(chǔ)的實(shí)際值進(jìn)行優(yōu)化的屈留,因此選擇一種類型不影響存儲(chǔ)要求。
  • 操作示例如下:
PUT my-index-000004
{"mappings":{"properties":{"number_of_bytes":{"type":"integer"},"time_in_seconds":{"type":"float"},"price":{"type":"scaled_float","scaling_factor":100}}}}

POST my-index-000004/_doc/1
{"number_of_bytes":100,"time_in_seconds":1,"scaling_factor":100}

GET my-index-000004/_search
{}
  • 支持的類型參數(shù):coerce(默認(rèn)true)测蘑、boost(默認(rèn)1.0)、doc_values(默認(rèn)true)康二、ignore_malformed(默認(rèn)false)碳胳、
    index(默認(rèn)true)、null_value(默認(rèn)null)沫勿、store(默認(rèn)false)挨约、meta味混,所以在默認(rèn)情況下,該類型字段支持可搜索诫惭,不可存儲(chǔ)翁锡。
Dates
  • 描述:日期類型家族,類型值包括date夕土、date_nanos馆衔。JSON沒(méi)有日期數(shù)據(jù)類型,所以在Elasticsearch的日期可以是:
    (1)包含格式化日期的字符串怨绣,例如角溃,“2015-01-01”或“2015/01/01 12:10:30”。
    (2)long數(shù)字值milliseconds-since-the-epoch篮撑。
    (3)integer數(shù)字值seconds-since-the-epoch减细。
    注:milliseconds-since-the-epoch 和 seconds-since-the-epoch 必須是非負(fù)數(shù)。格式化日期表示從1970以后的日期赢笨。
  • 操作示例如下:
PUT my-index-000005
{"mappings":{"properties":{"date":{"type":"date","store":true}}}}

PUT my-index-000005/_doc/1
{"date":"2015-01-01"} 

PUT my-index-000005/_doc/2
{ "date": "2015-01-01T12:10:30Z" } 

PUT my-index-000005/_doc/3
{"date":1420070400001} 

GET my-index-000005/_search
{"sort":{"date":"asc"}}
  • 在es內(nèi)部未蝌,如果指定了時(shí)區(qū),字符串形式日期被轉(zhuǎn)換為UTC茧妒,進(jìn)一步轉(zhuǎn)換為milliseconds-since-the-epoch進(jìn)行存儲(chǔ)萧吠;對(duì)于字符串形式日期的查詢,在內(nèi)部也是先轉(zhuǎn)換為long數(shù)字值進(jìn)行范圍查詢嘶伟,對(duì)于查詢結(jié)果和聚合的響應(yīng)怎憋,則將long數(shù)字轉(zhuǎn)換回原來(lái)字符串形式返回。
  • 日期格式可以自定義九昧,如果沒(méi)有指定格式绊袋,使用默認(rèn)格式:
// 必須日期+可選時(shí)間 或者 時(shí)間毫秒數(shù)
"strict_date_optional_time||epoch_millis"
  • 多個(gè)日期格式支持。通過(guò)使用||作為分隔符來(lái)分隔多個(gè)格式铸鹰。索引時(shí)將依次嘗試每種格式癌别,直到找到匹配的格式,操作示例如下:
PUT my-index-000005_01
{
  "mappings": {
    "properties": {
      "date": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}
  • 支持的類型參數(shù):boost(默認(rèn)1.0)蹋笼、doc_values(默認(rèn)true)展姐、format(默認(rèn)strict_date_optional_time||epoch_millis)、locale剖毯、ignore_malformed(默認(rèn)false)圾笨、index(默認(rèn)true)、null_value(默認(rèn)null)逊谋、store(默認(rèn)false)擂达、meta,所以在默認(rèn)情況下胶滋,該類型字段支持可搜索板鬓,不可存儲(chǔ)悲敷。
  • date_nanos 類型和 date 類型之間有一個(gè)重要區(qū)別,date數(shù)據(jù)類型以毫秒的分辨率存儲(chǔ)日期俭令。date_nanos數(shù)據(jù)類型以納秒分辨率存儲(chǔ)日期后德,這限制了date_nanos的日期范圍大約從1970年到2262。
Alias
  • 描述:字段別名類型抄腔,類型值alias瓢湃。別名映射為索引中的字段定義了一個(gè)替代名稱。在搜索請(qǐng)求中別名可以代替目標(biāo)字段妓柜。
  • 操作示例如下:
PUT my-index-000006
{
  "mappings": {
    "properties": {
      "distance": {
        "type": "long"
      },
      "route_length_miles": {
        "type": "alias",
        "path": "distance"
      }
    }
  }
}
PUT my-index-000006/_doc/1
{"distance":50} 
PUT my-index-000006/_doc/2
{"distance":10} 
GET my-index-000006/_search
{"query":{"range":{"route_length_miles":{"gte":39}}}}

注:path參數(shù)值必須對(duì)應(yīng)目標(biāo)字段的全路徑箱季,包括目錄字段的父級(jí)字段,如object1.object2.field棍掐。

  • 字段別名的目標(biāo)字段有一些限制:
    (1)目標(biāo)必須是一個(gè)具體字段藏雏,不能是一個(gè)對(duì)象或字段別名。
    (2)創(chuàng)建字段別名時(shí)作煌,目標(biāo)字段必須存在掘殴。
    (3)如果定義了嵌套對(duì)象,則字段別名必須具有與其目標(biāo)相同的嵌套范圍粟誓。
    (4)字段別名只能有一個(gè)目標(biāo)奏寨。

2.2 對(duì)象和關(guān)系型類型

Object
  • 描述:JSON對(duì)象類型,可以嵌套JSON對(duì)象鹰服。不需要顯式設(shè)置類型值為object病瞳,因?yàn)檫@是系統(tǒng)默認(rèn)值。
  • 操作示例如下:
PUT my-index-000007
{
  "mappings": {
    "properties": {
      "region": {
        "type": "keyword"
      },
      "manager": {
        "properties": {
          "age": {
            "type": "integer"
          },
          "name": {
            "properties": {
              "first": {
                "type": "text"
              },
              "last": {
                "type": "text"
              }
            }
          }
        }
      }
    }
  }
}

數(shù)據(jù)索引時(shí)悲酷,支持key-value鍵值對(duì)格式的數(shù)據(jù)套菜。

PUT my-index-000007/_doc/1
{
  "region": "US",
  "manager": {
    "age": 30,
    "name": {
      "first": "John",
      "last": "Smith"
    }
  }
}
PUT my-index-000007/_doc/2
{
  "region": "China",
  "manager.age": 100,
  "manager.name.first": "SanFeng",
  "manager.name.last": "Zhang"
}
  • 支持的類型參數(shù):
    (1)dynamic:是否應(yīng)該向現(xiàn)有對(duì)象動(dòng)態(tài)添加新屬性。接受true(默認(rèn)值)设易、false和strict逗柴。
    (2)enabled:對(duì)象字段的JSON值應(yīng)該被解析和索引(true,默認(rèn))還是完全忽略(false)顿肺。
    (3)properties:對(duì)象中的字段戏溺,可以是任何數(shù)據(jù)類型,包括object屠尊】趸觯可以向現(xiàn)有對(duì)象添加新屬性。
Flattened
  • 描述:扁平JSON對(duì)象類型讼昆,類型值flattened肋僧,將整個(gè)JSON對(duì)象映射為單個(gè)字段值。給定一個(gè)對(duì)象,flattened類型映射將解析出它的葉子值嫌吠,并將它們作為關(guān)鍵字索引到一個(gè)字段中。扁平的對(duì)象字段目前無(wú)法存儲(chǔ)掺炭,不能在映射中指定存儲(chǔ)參數(shù)辫诅。
  • 操作示例如下:
PUT my-index-000008
{"mappings":{"properties":{"title":{"type":"text"},"labels":{"type":"flattened"}}}}
POST my-index-000008/_doc/1
{"title":"Results are not sorted correctly.","labels":{"priority":"urgent","release":["v1.2.5","v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}

搜索數(shù)據(jù)時(shí),支持基本的查詢

GET my-index-000008/_search
{"query":{"match":{"labels.release":"v1.2.5"}}}
  • 如果對(duì)象具有大量或未知數(shù)量的唯一鍵涧狮,那么使用該數(shù)據(jù)類型將整個(gè)JSON對(duì)象創(chuàng)建一個(gè)字段映射炕矮,有助于防止映射爆發(fā)。
  • 該字段類型的對(duì)象具有一些限制者冤,其中包括只允許基本的查詢肤视,不支持?jǐn)?shù)值范圍查詢或高亮顯示,不支持通配符引用字段key查詢涉枫。
  • 支持的類型參數(shù):boost(默認(rèn)1.0)邢滑、doc_values(默認(rèn)true)、eager_global_ordinals(默認(rèn)false)愿汰、ignore_above困后、 index(默認(rèn)true)、index_options衬廷、null_value(默認(rèn)null)摇予、similarity(默認(rèn)BM25)、split_queries_on_whitespace(默認(rèn)false)吗跋,所以在默認(rèn)情況下侧戴,該類型字段支持可搜索,不可存儲(chǔ)跌宛。
Nested
  • 描述:嵌套對(duì)象類型酗宋,類型值nested,是對(duì)象數(shù)據(jù)類型的特殊版本秩冈,它允許以一種可以互相獨(dú)立查詢的方式對(duì)對(duì)象數(shù)組進(jìn)行索引本缠。
    使用嵌套對(duì)象類型對(duì)文檔的查詢開(kāi)銷很大,如果需要為對(duì)象數(shù)組建立索引并維護(hù)數(shù)組中每個(gè)對(duì)象的獨(dú)立性(可搜索等)入问,那么可以使用嵌套對(duì)象類型丹锹。
  • 在內(nèi)部,嵌套對(duì)象索引數(shù)組中的每個(gè)對(duì)象作為一個(gè)單獨(dú)的隱藏文檔芬失,這意味著每個(gè)嵌套對(duì)象可以通過(guò)嵌套查詢獨(dú)立于其他對(duì)象進(jìn)行查詢楣黍。
  • 操作示例如下:
PUT my-index-000009
{"mappings":{"properties":{"user":{"type":"nested"}}}}

PUT my-index-000009/_doc/1
{"group":"fans","user":[{"first":"John","last":"Smith"},{"first":"Alice","last":"White"}]}

# 返回匹配的數(shù)據(jù),如果是普通Object類型棱烂,查不到數(shù)據(jù)
GET my-index-000009/_search
{"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}}}}}

# 返回匹配的數(shù)據(jù)租漂,并且高亮顯示每個(gè)對(duì)象中first字段
GET my-index-000009/_search
{"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}},"inner_hits":{"highlight":{"fields":{"user.first":{}}}}}}}
Join
  • 描述:連接對(duì)象類型,類型值join,它在具有相同索引的文檔中創(chuàng)建父/子關(guān)系哩治。關(guān)系部分定義了文檔中的一組可能的關(guān)系秃踩,每個(gè)關(guān)系分別是父名稱和子名稱。
  • 操作示例如下:
    (1)定義父/子關(guān)系如下:
# my_join_field字段业筏,定義了簡(jiǎn)單的關(guān)系憔杨,question是answer的父類。
PUT my-index-000010
{
  "mappings": {
    "properties": {
      "my_id": {
        "type": "keyword"
      },
      "my_join_field": { 
        "type": "join",
        "relations": {
          "question": "answer" 
        }
      }
    }
  }
}

其中蒜胖,名稱為my_join_field字段為join字段類型消别,定義了簡(jiǎn)單的關(guān)系,question是answer的父類台谢。
(2)索引name="question"的數(shù)據(jù):

# 索引數(shù)據(jù)
PUT my-index-000010/_doc/1?refresh
{
  "my_id": "1",
  "text": "This is a question",
  "my_join_field": {
    "name": "question" 
  }
}

PUT my-index-000010/_doc/2?refresh
{
  "my_id": "2",
  "text": "This is another question",
  "my_join_field": {
    "name": "question"
  }
}

(3)接下來(lái)索引name="answer"(指定parent=1寻狂,即與文檔1建立父類關(guān)系)的數(shù)據(jù):

PUT my-index-000010/_doc/3?routing=1&refresh 
{
  "my_id": "3",
  "text": "This is an answer",
  "my_join_field": {
    "name": "answer", 
    "parent": "1" 
  }
}

PUT my-index-000010/_doc/4?routing=1&refresh
{
  "my_id": "4",
  "text": "This is another answer",
  "my_join_field": {
    "name": "answer",
    "parent": "1"
  }
}

(4)查詢聚合數(shù)據(jù),條件是name="answer" 并且 parent_id=1朋沮。

GET my-index-000010/_search
{
  "query": {
    "parent_id": { 
      "type": "answer",
      "id": "1"
    }
  },
  "aggs": {
    "parents": {
      "terms": {
        "field": "my_join_field#question", 
        "size": 10
      }
    }
  }
}

(5)返回結(jié)果片段如下

"aggregations" : {
    "parents" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "1",
          "doc_count" : 2
        }
      ]
    }
  }

2.3 結(jié)構(gòu)體類型

Range
  • 描述:范圍類型家族蛇券,類型值包括integer_range、float_range朽们、long_range怀读、double_range、date_range骑脱、ip_range菜枷。
  • 操作示例如下:
PUT my-index-000011
{
  "mappings": {
    "properties": {
      "expected_attendees": {
        "type": "integer_range"
      },
      "time_frame": {
        "type": "date_range",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      },
      "ip_allowlist": {
        "type": "ip_range"
      }
    }
  }
}

PUT my-index-000011/_doc/1?refresh
{
  "expected_attendees": {
    "gte": 10,
    "lte": 20
  },
  "time_frame": {
    "gte": "2015-10-31 12:00:00",
    "lte": "2015-11-01"
  },
  "ip_allowlist": "192.168.0.0/16"
}
# term query
GET my-index-000011/_search
{"query":{"term":{"expected_attendees":{"value":12}}}}
# 時(shí)間范圍查詢是否匹配
GET my-index-000011/_search
{"query":{"range":{"time_frame":{"gte":"2015-10-31","lte":"2015-11-01","relation":"within"}}}}
# IP地址查詢是否匹配
GET my-index-000011/_search
{"query":{"term":{"ip_allowlist":{"value":"192.124.1.100"}}}}
  • 支持的類型參數(shù):coerce(默認(rèn)true)、boost(默認(rèn)1.0)叁丧、
    index(默認(rèn)true)啤誊、store(默認(rèn)false),所以在默認(rèn)情況下拥娄,該類型字段支持可搜索蚊锹,不可存儲(chǔ)。
IP
  • 描述:IP字段類型稚瘾,類型值ip牡昆,支持索引或者存儲(chǔ)IPv4或IPv6地址。
  • 操作示例如下:
# 創(chuàng)建索引摊欠,Mapping包含ip類型
PUT my-index-000012
{
  "mappings": {
    "properties": {
      "ip_addr": {
        "type": "ip"
      }
    }
  }
}
#索引數(shù)據(jù)
PUT my-index-000012/_doc/1
{"ip_addr":"192.168.1.1"}
#查詢ip數(shù)據(jù)
GET my-index-000012/_search
{"query":{"term":{"ip_addr":"192.168.0.0/16"}}}
  • 支持的類型參數(shù):boost(默認(rèn)1.0)丢烘、doc_values(默認(rèn)true)、ignore_malformed(默認(rèn)false)些椒、 index(默認(rèn)true)播瞳、null_value(默認(rèn)null)、store(默認(rèn)false)免糕,所以在默認(rèn)情況下赢乓,該類型字段支持可搜索忧侧,不可存儲(chǔ)。

2.4 聚合數(shù)據(jù)類型

Histogram
  • 描述:直方圖類型牌芋,類型值histogram蚓炬,用于存儲(chǔ)表示直方圖的預(yù)聚合數(shù)字?jǐn)?shù)據(jù)的字段,這個(gè)數(shù)據(jù)是用兩個(gè)成對(duì)的數(shù)組定義的:
    (1)一個(gè)double類型數(shù)組values姜贡,表示直方圖的桶數(shù)试吁,這些值必須按升序提供。
    (2)一個(gè)對(duì)應(yīng)的integer類型計(jì)數(shù)數(shù)組counts楼咳,表示每個(gè)桶的個(gè)數(shù),這些數(shù)字必須是正的或零烛恤。
    因?yàn)関alues數(shù)組中的元素對(duì)應(yīng)于count數(shù)組中相同位置的元素母怜,所以這兩個(gè)數(shù)組必須具有相同的長(zhǎng)度。
  • 操作示例如下:
# my_histogram, 直方圖類型字段存儲(chǔ)百分比數(shù)據(jù)
# my_text, keyword類型字段存儲(chǔ)直方圖標(biāo)題
PUT my-index-000013
{
  "mappings" : {
    "properties" : {
      "my_histogram" : {
        "type" : "histogram"
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}
# 存儲(chǔ)預(yù)聚合數(shù)據(jù)到histogram_1 和 histogram_2
PUT my-index-000013/_doc/1
{
  "my_text" : "histogram_1",
  "my_histogram" : {
      "values" : [0.1, 0.2, 0.3, 0.4, 0.5], 
      "counts" : [3, 7, 23, 12, 6] 
   }
}
PUT my-index-000013/_doc/2
{
  "my_text" : "histogram_2",
  "my_histogram" : {
      "values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5], 
      "counts" : [8, 17, 8, 7, 6, 2] 
   }
}
  • 對(duì)于每個(gè)文檔缚柏,直方圖類型字段只能存儲(chǔ)values數(shù)組和count數(shù)組組成的一對(duì)苹熏,不支持嵌套數(shù)組。并且由于直方圖數(shù)據(jù)沒(méi)有被索引币喧,所以只能使用直方圖類型字段用于聚合和查詢轨域。直方圖類型字段不支持排序。
  • 直方圖類型字段數(shù)據(jù)被存儲(chǔ)為二進(jìn)制文檔值杀餐,而不是索引干发。它的大小以字節(jié)為單位最多為13 * numValues,其中numValues是所提供數(shù)組的長(zhǎng)度史翘。

2.5 文本搜索類型

Text
  • 描述:文本類型枉长,全文索引的字段,例如電子郵件的正文或產(chǎn)品的描述琼讽。這些字段將被分析必峰,也就是說(shuō),它們將通過(guò)分析器在索引之前將字符串轉(zhuǎn)換為單個(gè)term的集合钻蹬。這個(gè)分析過(guò)程允許Elasticsearch在每個(gè)全文字段中搜索單個(gè)單詞吼蚁。文本類型字段不用于排序,也很少用于聚合(盡管重要文本聚合是一個(gè)明顯的例外)问欠。如果需要索引結(jié)構(gòu)化的內(nèi)容肝匆,如電子郵件地址、主機(jī)名溅潜、狀態(tài)碼或標(biāo)簽术唬,那么盡可能使用keyword類型字段。
  • 操作示例如下:
PUT my-index-000014
{
  "mappings": {
    "properties": {
      "full_name": {
        "type":  "text"
      }
    }
  }
}

PUT my-index-000014/_doc/1
{"full_name":"Johnny Lu"}
  • 支持的類型參數(shù):
    (1)analyzer:在索引時(shí)和搜索時(shí)都應(yīng)該用于文本字段的分析器(除非被search_analyzer覆蓋)滚澜。默認(rèn)為standard分析器粗仓,或index分析器。
    (2)其他參數(shù):boost(默認(rèn)1.0)、eager_global_ordinals(默認(rèn)false)借浊、fielddata(默認(rèn)false)塘淑、fielddata_frequency_filter(默認(rèn)加載所有值)、fields蚂斤、 index(默認(rèn)true)存捺、index_options、index_prefixes曙蒸、index_phrases捌治、norms(默認(rèn)true)、position_increment_gap纽窟、store(默認(rèn)false)肖油、search_analyzer、search_quote_analyzer(默認(rèn)search_analyzer)臂港、similarity(默認(rèn)BM25)森枪、term_vector(默認(rèn)沒(méi)有)、meta审孽。
completion
  • 描述:完成類型县袱,類型值completion,用于自動(dòng)完成suggestions佑力。
  • 操作示例如下:
PUT my-index-000015
{
  "mappings": {
    "properties": {
      "suggest": {
        "type": "completion"
      },
      "title": {
        "type": "keyword"
      }
    }
  }
}
  • 支持的類型參數(shù):
    (1)analyzer:索引時(shí)要使用的分析器式散,默認(rèn)為simple分析器。
    (2)search_analyzer:搜索時(shí)要使用的分析器搓萧,默認(rèn)與參數(shù)analyzer一樣杂数。
    (3)其他參數(shù):preserve_separators(默認(rèn)true)、preserve_position_increments(默認(rèn)true)瘸洛、max_input_length揍移。
search_as_you_type
  • 描述:類型值search_as_you_type,search_as_you_type字段類型類似文本類型反肋,經(jīng)過(guò)優(yōu)化那伐,它會(huì)創(chuàng)建一系列子字段,通過(guò)對(duì)這些子字段進(jìn)行分析石蔗,并找出通過(guò)部分來(lái)匹配整個(gè)文本值的有效term罕邀,將其索引。該類型的字段既支持前綴補(bǔ)全养距,也支持中綴補(bǔ)全诉探。
  • 操作示例如下:
PUT my-index-000016
{"mappings":{"properties":{"my_field":{"type":"search_as_you_type"}}}}
PUT my-index-000016/_doc/1?refresh
{"my_field":"quick brown fox jump lazy dog"}
GET my-index-000016/_search
{
  "query": {
    "multi_match": {
      "query": "brown f",
      "type": "bool_prefix",
      "fields": [
        "my_field",
        "my_field._2gram",
        "my_field._3gram"
      ]
    }
  }
}
  • 子字段中shingles的大小可以使用max_shingle_size映射參數(shù)來(lái)配置。默認(rèn)值為3棍厌,該參數(shù)的有效值為整數(shù)值2 - 4(含整數(shù)值)肾胯。
  • 支持的類型參數(shù):
    (1)analyzer:在索引時(shí)和搜索時(shí)都應(yīng)該用于文本字段的分析器(除非被search_analyzer覆蓋)竖席。默認(rèn)為standard分析器,或index分析器敬肚。
    (2)search_analyzer:搜索時(shí)要使用的分析器毕荐,默認(rèn)與參數(shù)analyzer一樣。
    (3)其他參數(shù): index(默認(rèn)true)艳馒、norms(默認(rèn)true)憎亚、store(默認(rèn)false)、search_quote_analyzer(默認(rèn)search_analyzer)弄慰、similarity(默認(rèn)BM25)第美、term_vector(默認(rèn)沒(méi)有)。
Token count
  • 描述:標(biāo)記計(jì)數(shù)類型陆爽,類型值token_count斋日,token_count類型的字段實(shí)際上是一個(gè)integer字段,該類型字段分析接受的字符串值墓陈,統(tǒng)計(jì)出字符串中標(biāo)記的數(shù)量并對(duì)其進(jìn)行索引。

  • 操作示例如下:

PUT my-index-000017
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "length": {
            "type": "token_count",
            "analyzer": "standard"
          }
        }
      }
    }
  }
}
PUT my-index-000017/_doc/1
{ "name": "John Smith" }
PUT my-index-000017/_doc/2
{ "name": "Rachel Alice Williams" }
GET my-index-000017/_search
{"query":{"term":{"name.length":3}}}
  • 支持的類型參數(shù):
    (1)analyzer:用來(lái)分析字符串值的分析器第献。必需的贡必。為了獲得最佳性能,請(qǐng)使用不帶tokens過(guò)濾器的分析器庸毫。
    (2)enable_position_increments:指示是否應(yīng)該計(jì)算位置增量仔拟。如果不計(jì)算分析器過(guò)濾器刪除的tokens,則設(shè)置為false飒赃。默認(rèn)值為true利花。
    (3)其他參數(shù):boost(默認(rèn)1.0)、doc_values(默認(rèn)true)载佳、index(默認(rèn)true)炒事、null_value(默認(rèn)null)、store(默認(rèn)false)蔫慧。

2.6 文檔排名類型

Dense vector
  • 描述:密集向量場(chǎng)類型挠乳,類型值dense_vector,dense_vector類型字段存儲(chǔ)浮點(diǎn)值的密集向量姑躲。向量的最大維數(shù)不應(yīng)超過(guò)2048睡扬,dense_vector類型字段是一個(gè)單值字段。這些向量可用于文檔評(píng)分黍析。例如卖怜,文檔分?jǐn)?shù)可以表示給定查詢向量和索引文檔向量之間的距離。
  • 操作示例如下:
PUT my-index-000018
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3  
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}
PUT my-index-000018/_doc/1
{"my_text":"text1","my_vector":[0.5,10,6]}
PUT my-index-000018/_doc/2
{"my_text":"text2","my_vector":[-0.5,10,10]}
  • 支持的類型參數(shù):
    dims:向量的維數(shù)阐枣,是必需的參數(shù)
Rank feature
  • 描述:特征排名類型马靠,類型值rank_feature奄抽,rank_feature類型字段只接受數(shù)字來(lái)建立索引,以便后續(xù)使用rank_feature查詢時(shí)來(lái)增強(qiáng)查詢中的文檔虑粥。
  • 操作示例如下:
PUT my-index-000019
{
  "mappings": {
    "properties": {
      "pagerank": {
        "type": "rank_feature" 
      },
      "url_length": {
        "type": "rank_feature",
        "positive_score_impact": false 
      }
    }
  }
}
PUT my-index-000019/_doc/1
{"pagerank":8,"url_length":22}
PUT my-index-000019/_doc/2
{"pagerank":9,"url_length":23}
# 使用rank_feature查詢如孝,與值正相關(guān)排序
GET my-index-000019/_search
{"query":{"rank_feature":{"field":"pagerank"}}}
  • rank_feature類型字段只支持單值字段和嚴(yán)格正數(shù)值。多值字段和負(fù)數(shù)值將被拒絕娩贷。
  • rank_feature類型字段不支持查詢第晰、排序或聚合。只能在rank_feature查詢中使用彬祖。
  • rank_feature類型字段僅保留9位有效位以保證精度茁瘦,換算成相對(duì)誤差約為0.4%。
  • 與分?jǐn)?shù)負(fù)相關(guān)的排名特性應(yīng)該將參數(shù)positive_score_impact設(shè)置為false(默認(rèn)為true)储笑。rank_feature查詢將使用它來(lái)修改評(píng)分公式甜熔,使得分隨著特征值的增加而減少,而不是增加突倍。例如在網(wǎng)絡(luò)搜索中腔稀,url長(zhǎng)度是一個(gè)常用的特征,它與分?jǐn)?shù)呈負(fù)相關(guān)羽历。
Rank features
  • 描述:特征集排名類型焊虏,類型值rank_features,rank_features字段可以為數(shù)值特征向量建立索引秕磷,以便后續(xù)使用rank_feature查詢來(lái)增強(qiáng)查詢中的文檔诵闭。它類似于rank_feature數(shù)據(jù)類型,rank_features更適合在特性列表稀疏的情況下使用澎嚣。
  • 操作示例如下:
PUT my-index-000020
{
  "mappings": {
    "properties": {
      "topics": {
        "type": "rank_features" 
      }
    }
  }
}
PUT my-index-000020/_doc/1
{"topics":{"politics":20,"economics":50.8}}
PUT my-index-000020/_doc/2
{"topics":{"politics":5.2,"sports":80.1}}
GET my-index-000020/_search
{"query":{"rank_feature":{"field":"topics.politics"}}}
  • rank_features類型字段必須是具有字符串鍵和嚴(yán)格為正數(shù)值的散列疏尿。
  • rank_features類型字段只支持單值特性和嚴(yán)格正數(shù)值。多值字段和零值或負(fù)數(shù)值將被拒絕
  • rank_features類型字段不支持查詢易桃、排序或聚合褥琐。只能在rank_feature查詢中使用。
  • rank_features類型字段僅保留9位有效位以保證精度颈抚,換算成相對(duì)誤差約為0.4%踩衩。

2.7 空間數(shù)據(jù)類型

Geo point
  • 描述:地理空間類型,類型值geo_point贩汉,geo_point類型的字段接受經(jīng)緯度對(duì)驱富。
  • 可用5種數(shù)據(jù)類型表示geo_point數(shù)據(jù)類型,操作示例如下:
PUT my-index-000021
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}
# 使用object對(duì)象類型匹舞,指定lat和lon褐鸥,表示geo_point:
PUT my-index-000021/_doc/1
{"text":"Geo-point as an object","location":{"lat":41.12,"lon":-71.34}}
# 使用字符串格式:“l(fā)at,lon” ,表示geo_point:
PUT my-index-000021/_doc/2
{"text":"Geo-point as a string","location":"41.12,-71.34"}
# 使用geohash字符串赐稽,表示geo_point
PUT my-index-000021/_doc/3
{"text":"Geo-point as a geohash","location":"drm3btev3e86"}
# 使用數(shù)組形式:[lon, lat]叫榕,表示geo_point
PUT my-index-000021/_doc/4
{"text":"Geo-point as an array","location":[-71.34,41.12]}
# 使用文本點(diǎn)表示浑侥,格式為“POINT(lon lat)”,表示geo_point
PUT my-index-000021/_doc/5
{"text":"Geo-point as a WKT POINT primitive","location":"POINT (-71.34 41.12)"}

GET my-index-000021/_search
{
  "query": {
    "geo_bounding_box": { 
      "location": {
        "top_left": {
          "lat": 42,
          "lon": -72
        },
        "bottom_right": {
          "lat": 40,
          "lon": -74
        }
      }
    }
  }
}

  • 支持的類型參數(shù):
    (1)ignore_malformed:如果值為true晰绎,則忽略有缺陷的地理點(diǎn)寓落。如果值為false(默認(rèn)),遇到格式不正確的地理點(diǎn)會(huì)拋出一個(gè)異常并拒絕整個(gè)文檔荞下。
    (2)ignore_z_value:如果值為true(默認(rèn)的)伶选,三維空間點(diǎn)將被接受(存儲(chǔ)在source中),但只有緯度和經(jīng)度值將被索引尖昏;第三個(gè)維度被忽略仰税。如果為false,除了緯度和經(jīng)度以外抽诉,遇到其他任何地理點(diǎn)都會(huì)拋出異常并拒絕整個(gè)文檔陨簇。
    (3)null_value:接受一個(gè)geopoint值,它代替任何顯式的空值迹淌。默認(rèn)值為null河绽,這意味著該字段被視為丟失。
Point
  • 描述:點(diǎn)數(shù)據(jù)類型唉窃,類型值point葵姥,point類型用于對(duì)落在二維平面坐標(biāo)系中的任意x、y對(duì)的索引和搜索句携。
  • 指定一個(gè)point類型有四種方式,操作示例如下:
PUT my-index-000022
{
  "mappings": {
    "properties": {
      "location": {
        "type": "point"
      }
    }
  }
}
# 使用object對(duì)象類型允乐,指定x和y矮嫉,表示point:
PUT my-index-000022/_doc/1
{"text":"Point as an object","location":{"x":41.12,"y":-71.34}}
# 使用字符串格式:“x,y” ,表示point:
PUT my-index-000022/_doc/2
{"text":"Point as a string","location":"41.12,-71.34"}
# 使用數(shù)組形式:[x, y]牍疏,表示point
PUT my-index-000022/_doc/3
{"text":"Point as an array","location":[41.12,-71.34]}
# 使用文本點(diǎn)表示蠢笋,格式為“POINT(x y)”,表示geo_point
PUT my-index-000022/_doc/4
{"text":"Point as a WKT POINT primitive","location":"POINT (41.12 -71.34)"}
  • 目前還不能直接對(duì)point類型數(shù)據(jù)進(jìn)行排序或字段搜索鳞陨。只能通過(guò)_source字段搜索昨寞。
  • 支持的類型參數(shù):
    (1)ignore_malformed:如果值為true,則忽略有缺陷的點(diǎn)厦滤。如果值為false(默認(rèn))援岩,遇到格式不正確的點(diǎn)會(huì)拋出一個(gè)異常并拒絕整個(gè)文檔。
    (2)ignore_z_value:如果值為true(默認(rèn)的)掏导,三個(gè)維度點(diǎn)將被接受(存儲(chǔ)在source中)享怀,但只有x和y的值將被索引;第三個(gè)維度被忽略趟咆。如果為false添瓷,除了x和y以外梅屉,遇到其他任何維度都會(huì)拋出異常并拒絕整個(gè)文檔。
    (3)null_value:接受一個(gè)point值鳞贷,它代替任何顯式的空值坯汤。默認(rèn)值為null,這意味著該字段被視為丟失搀愧。

2.8 其他類型

Percolator
  • 描述:過(guò)濾器類型惰聂,類型值percolator,percolator類型將json結(jié)構(gòu)解析為原生查詢并存儲(chǔ)該查詢妈橄,以便percolate query可以使用它來(lái)匹配所提供的文檔庶近。
  • 操作示例如下:
# 配置percolator字段類型
PUT my-index-01
{
  "mappings": {
    "properties": {
      "query" : {
        "type" : "percolator"
      },
      "body" : {
        "type": "text"
      }
    }
  }
}
# 為索引定義一個(gè)別名,這樣眷蚓,在重索引系統(tǒng)/應(yīng)用程序的情況下鼻种,不需要更改查詢索引名
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "my-index",
        "alias": "queries" 
      }
    }
  ]
}
# 將原生查詢解析并索引,查詢條件為文檔字段body包含"quick brown fox"之一
PUT queries/_doc/1?refresh
{
  "query" : {
    "match" : {
      "body" : "quick brown fox"
    }
  }
}
# percolate查詢沙热,所提供文檔的字段名與查詢條件中的字段名(如body)必須相同
GET /queries/_search
{
  "query": {
    "percolate" : {
      "field" : "query",
      "document" : {
        "body" : "fox jumps over the lazy dog"
      }
    }
  }
}

3. 結(jié)語(yǔ)

這里只是簡(jiǎn)單介紹了Elasticsearch的部分字段類型叉钥,如有需要,可通過(guò)Elasticsearch官方文檔進(jìn)一步了解更多數(shù)據(jù)類型篙贸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末投队,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爵川,更是在濱河造成了極大的恐慌敷鸦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝贡,死亡現(xiàn)場(chǎng)離奇詭異盒粮,居然都是意外死亡堰酿,警方通過(guò)查閱死者的電腦和手機(jī)奋渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門祖很,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颇蜡,你說(shuō)我怎么就攤上這事价说。” “怎么了风秤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鳖目,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我缤弦,道長(zhǎng)疑苔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任甸鸟,我火速辦了婚禮惦费,結(jié)果婚禮上兵迅,老公的妹妹穿的比我還像新娘。我一直安慰自己薪贫,他們只是感情好恍箭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瞧省,像睡著了一般扯夭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞍匾,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天交洗,我揣著相機(jī)與錄音,去河邊找鬼橡淑。 笑死构拳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梁棠。 我是一名探鬼主播置森,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼符糊!你這毒婦竟也來(lái)了凫海?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤男娄,失蹤者是張志新(化名)和其女友劉穎行贪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體模闲,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓮顽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了围橡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缕贡,死狀恐怖翁授,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晾咪,我是刑警寧澤收擦,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站谍倦,受9級(jí)特大地震影響塞赂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昼蛀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一宴猾、第九天 我趴在偏房一處隱蔽的房頂上張望圆存。 院中可真熱鬧,春花似錦仇哆、人聲如沸沦辙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)油讯。三九已至,卻和暖如春延欠,著一層夾襖步出監(jiān)牢的瞬間陌兑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工由捎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔综,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓隅俘,卻偏偏與公主長(zhǎng)得像邻奠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子为居,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354