创作人:欧阳楚才
映射(mapping)就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型,比如 Text,Keyword,Integer 或 Date ,以及 Lucene 是如何索引和存储这些字段的。
Elasticsearch 支持如下简单字段类型:
字符串: text,keyword整数:byte,short,integer,long浮点数: float,double布尔型: boolean日期: date更多的字段类型比如 geo_point,ip,nested 等可以在链接处查看:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html当你索引一个包含新字段的文档之前,未曾出现 Elasticsearch 会使用动态映射,通过 JSON 中基本数据类型,尝试猜测字段类型,使用如下规则:
JSON 数据字段类型布尔型:true 或者 falseboolean整数:123long浮点数:123.45double字符串,有效日期:2021-05-01date字符串:foo bartext 和 keyword注意:如果你通过引号 ( "123" ) 索引一个数字,它会被映射为字符串类型 text 和 keyword,而不是 long 。但如果这个字段已经映射为 long ,那么 Elasticsearch 会尝试将这个字符串转化为 long (在 coerce 设置为 true 的情况下),如果无法转化,则抛出一个异常。
查看映射通过 /_mapping ,我们可以查看 Elasticsearch 在一个或多个索引中的映射。
Elasticsearch 文档写入示例:
PUT twitter/_doc/1 "user": "kimchy", "post_date": "2009-11-15T13:12:00", "message": "Trying out Elasticsearch, so far so good?" PUT twitter/_doc/2 "user": "kimchy", "post_date": "2009-11-15T14:12:12", "message": "Another tweet, will it be indexed?" PUT twitter/_doc/3 "user": "elastic", "post_date": "2010-01-15T01:46:38", "message": "Building the site, should be kewl" }
查看索引映射示例:
GET twitter/_mapping
Elasticsearch 根据我们索引的文档,为字段动态生成的映射:
{ "twitter" : { "mappings" : { "properties" : { "message" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 "post_date" : { "type" : "date" "user" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 }
注意:错误的映射,例如将年龄字段映射为 text 类型,而不是 integer ,会导致查询出现令人困惑的结果。
检查一下,而不是假设你的映射是正确的。
自定义字段映射尽管在很多情况下基本字段数据类型已经够用,但你经常需要为单独字段自定义映射,特别是字符串字段。自定义映射允许你执行下面的操作:
全文字符串字段和精确值字符串字段的区别使用特定语言分析器优化字段以适应部分匹配指定自定义数据格式还有更多字段最重要的属性是 type 。
{ "number_of_clicks": { "type": "integer" }
字符串字段类型,包括全文字符串 text 和精确值字符串 keyword。
text 类型字段的最重要属性是分析器 analyzer,默认 Elasticsearch 使用 Standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 、english、cjk:
{ "message": { "type": "text", "analyzer": "cjk" }创建/更新映射
当你首次创建一个索引的时候,可以指定类型的映射。你也可以使用 /_mapping 更新映射。
我们可以更新一个映射来添加一个新字段,但不能更新一个现有的 mapping 把它的字段类型从一个变为另外一个,比如从 text 变为 keyword。我
们可以在维持现有 mapping 的情况下,把一个字段变成一个 multi-field 字段。
为了描述指定映射的两种方式,我们先删除 twitter 索引:
DELETE twitter
创建一个新索引,指定 message 字段使用 cjk 分析器:
PUT twitter "settings": { "number_of_shards": "5", "number_of_replicas": "1" "mappings": { "properties": { "user": { "type": "keyword" "post_date": { "type": "date" "message": { "type": "text", "analyzer": "cjk" }
通过消息体中指定的 mappings 创建了索引映射,索引设置 settings 中通过 number_of_shards 指定分片数,number_of_replicas 指定副本数。
给映射增加一个新的名为 tag 的 keyword 类型字段,使用 _mapping :
PUT twitter/_mapping "properties": { "tag": { "type": "keyword" }
我们不需要再次列出所有已存在的字段,因为无论如何我们都无法改变它们,新字段已经被合并到存在的映射中。
测试映射可以使用 analyze API 测试字符串字段的映射,比较下面两个请求的输出:
GET /twitter/_analyze "field": "message", "text": "搜索引擎" GET /twitter/_analyze "field": "tag", "text": "搜索引擎" }
消息体里面传入我们想要分析的文本。message 字段产生 3 个词条 ”搜索“、”索引” 和 ”引擎“, tag 字段产生单独的词条”搜索引擎“,换句话说,我们的映射正常工作。
本文介绍了北京慧达天下如何使用运维编排OOS提高发布效率。 公司介绍 公司名称:...
TOP云 (west.cn)1月25日消息,近日,功夫贷宣布获得4000万人民币A轮融资,本轮...
背景 2020年9月16日 Snowflake成功IPO 交易首日市场估值达到704亿美元 募集资金3...
描述 你正在和你的朋友玩 猜数字 (Bulls and Cows)游戏:你写下一个数字让你的朋...
有很多人在听说大数据之后,会开始纠结JAVA与大数据的区别,甚至还在纠结Java和...
我们知道效能提升 就是要应用系统方法实践和工具 通过它们改进技术、工程能力和...
hk 域名 哪里注册? .hk域名 在国内是可以注册的,只要提供了.hk 域名注册 服务...
作者 | 亮言 来源 | 阿里技术公众号 一 背景 订单状态流转是交易系统的最为核心...
约束与限制 只有运行中的云服务器云主机才允许用户登录。 Windows操作系统用户名...
本文由网易云音乐实时计算平台研发工程师岳猛分享,主要从以下四个部分将为大家...