有做网站赚钱的吗,太原关键词网站排名,网页浏览器排行榜前十名,朔州网站建设Elasticsearch Mapping字段类型之keyword 一、前言二、keyword2.1 keyword适用场景2.2 keyword实验2.3 手动设置keyword类型 三、constant_keyword类型四、wildcard类型 一、前言
ES的keyword类型家族有3种#xff1a;
keyword#xff0c;用于结构化内容#xff0c;如ID、… Elasticsearch Mapping字段类型之keyword 一、前言二、keyword2.1 keyword适用场景2.2 keyword实验2.3 手动设置keyword类型 三、constant_keyword类型四、wildcard类型 一、前言
ES的keyword类型家族有3种
keyword用于结构化内容如ID、邮箱、邮编、手机号、主机名、状态码或标记constant_keyword某个字段为constant_keyword类型则该index中所有文档的该字段的值必须一致wildcard存非机构化数据且值的内容大相似性低的数据如HTTP请求体Log日志这些让人阅读性差的数据。
其中第1个keyword类型是最常用的类型后面2个类型出现的比较晚使用的场景也比较少。
二、keyword
2.1 keyword适用场景
keyword类型通常存储结构化数据对keyword类型不能进行match查询适合用keyword的例子
场景值订单状态1未付款2已付款3申请退款4已退款HTTP状态码200400500404ID/手机号/邮箱/性别对手机号没必要分词也不需要数学计算所以也不能设为数字类型用户画像标签学生IT男腐女宝妈
ES把keyword类型的值作为一整体存在倒排索引中不进行分词。keyword适合存结构化数据如性别、手机号、数据状态、标签HttpCode(404,200,500)等。字段常用来精确查询、过滤、排序、聚合时应设为keyword而不是数值型。如果某个字段你经常用来做range查询, 你还是设置为数值型(integer,long)ES对数字的range有优化。还可以把字段设为multi-field这样又有keyword类型又有数值类型方便多种方式的使用。最长支持32766个UTF-8类型的字符但放入倒排索引时只截取前一段字符串长度由ignore_above参数决定默认ignore_above : 256。
2.2 keyword实验
1创建一个文档
PUT /pigg_user/_doc/1
{name: 冬哥,age: 32
}2查询name冬哥的数据用term在name字段上查询是查询不到文档的
这条语句是查询不到的
GET /pigg_user/_search
{query: {term: {name: 冬哥}}
}3查看文档的mapping 要想探知没有搜到的原因得先看排查文档的mapping发现name是text类型其下面有一个keyword子类型。
GET /pigg_user/_mapping#返回如下
{pigg_user : {mappings : {properties : {age : {type : long},name : {type : text,fields : {keyword : { #这行的keyword是字段名全称是name.keywordtype : keyword, #这行的keyword是指类型ignore_above : 256 #这里的ignore_above下面会讲}}}}}}
}4分析原因 如果不设置mappingES默认把字符串设为text类型并包含一个keyword子类型。 name是text类型“冬哥”这个词已经被拆成“冬”和“哥”这2个词。 所以上面用term来匹配“冬哥”时查询不到数据。 简单理解
“name”这个字段按照“冬”和“哥”2个词存的根据“冬”或者“哥”都能term查询到文档。“name.keyword”这个字段存储的是“冬哥”这完整字符串。
#根据name匹配“冬”可以查询到文档
GET /pigg_user/_search
{query: {term: {name: 冬}}
}#根据name.keyword匹配冬哥可以查询到文档
GET /pigg_user/_search
{query: {term: {name.keyword: 冬哥}}
}#根据name.keyword匹配冬查询不到文档
GET /pigg_user/_search
{query: {term: {name.keyword: 冬}}
}2.3 手动设置keyword类型
#先删除之前创建的index
DELETE pigg_user#设置name为keywordage为short。
PUT pigg_user
{mappings: {properties: {name: {type: keyword},age: {type: short}}}
}#新增一个文档
PUT /pigg_user/_doc/1
{name: 冬哥,age: 32
}#根据name精确匹配可以查到数据
GET /pigg_user/_search
{query: {term: {name: 冬哥}}
}三、constant_keyword类型
constant_keyword 是 keyword 字段的特例用于索引中所有文档具有相同值的情况。
PUT logs-debug
{mappings: {properties: {timestamp: {type: date},message: {type: text},level: {type: constant_keyword, #指明level这个字段是constant_keyword类型value: debug #且所有文档的level字段的值都是debug}}}
}constant_keyword 支持与 keyword 字段相同的查询和聚合而且constant_keyword的效率更高因为ES利用所有文档的的某个constant_keyword字段的值必须相同的这一事实进行了针对性优化。
允许提交没有字段值或值等于映射中配置的值的文档。 以下两个索引请求是等效的
POST logs-debug/_doc
{date: 2019-12-12,message: Starting up Elasticsearch,level: debug
}POST logs-debug/_doc
{date: 2019-12-12,message: Starting up Elasticsearch
}如果把level设置成非debug的值比如error则会返回错误
POST logs-debug/_doc
{date: 2019-12-12,message: Starting up Elasticsearch,level: error
}返回如下错误提示
caused_by : {type : illegal_argument_exception,reason : [constant_keyword] field [level] only accepts values that are equal to the value defined in the mappings [debug], but got [error]
}constant_keyword类型使用的场景确实非常少见所以用的很少。
四、wildcard类型
当你要在某个非结构化数据上进行wildcard或regexp查询的时候wildcard类型就比较合适了。
这种非结构化数据的内容一般是机器产生的(machine-generated)它们的可阅读比较低不适合我们人阅读比如日志message或者HTTP的请求体。
PUT my-index-000001
{mappings: {properties: {my_wildcard: {type: wildcard}}}
}PUT my-index-000001/_doc/1
{my_wildcard : This string can be quite lengthy
}GET my-index-000001/_search
{query: {wildcard: {my_wildcard: {value: *quite*lengthy}}}
}