ES中type和keyword两个数据类型的区别

举报
神的孩子在歌唱 发表于 2023/09/12 09:36:48 2023/09/12
【摘要】 参考文章:https://segmentfault.com/q/1010000017312707ES数据类型:type与keyword:https://blog.csdn.net/ywb201314/article/details/112667516了解数据类型简单的类型: text、keyword、date、long、double、boolean和ip复杂类型有:object和nested...

参考文章:


了解


  1. 数据类型

    • 简单的类型: text、keyword、date、long、double、boolean和ip

    • 复杂类型有:object和nested

    • 较特殊的类型:geo_point,geo_shape,和completion

  2. 当你没有以Explicit mapping 的形式为你的索引字段预先指定mapping的话,ES就会使用Dynamic Mapping,通过推断你传入的文档中字段的值对字段进行动态映射

比如你直接在文档中直接传入字段"name":"小陈",那么es就会动态映射如下mapping


image-20220330175810765



text和keyword的对比

ES5.0及以后的版本取消了string类型,将原先的string类型拆分为textkeyword两种类型。它们的区别在于text会对字段进行分词处理而keyword则不会。前者会对查询内容做分词处理之后再匹配,而后者则是直接对查询结果做精确匹配。


  1. 在Elasticsearch中,正常添加数据,ES会自动识别所添加数据的类型,并为它分配类型,并为每个特殊类型分别建索引,以用来进行之后的搜索,而作为全文搜索引擎,ES将String域的字段可以分为准确数据类型,和全文文本类型

    • 准确数据类型: keyword,直接被存储为了二进制,检索时我们直接匹配,不匹配就返回false

    • 全文文本类型: text,这个的检索不是直接给出是否匹配,而是检索出相似度,并按照相似度由高到低返回结果

  2. 也就是说text是将字段拆分,然后找到最匹配拿哪项(无法全匹配),keyword是全匹配才可以

  3. ES的term query做的是精确匹配而不是分词查询,因此对text类型的字段做term查询将是查不到结果的(除非字段本身经过分词器处理后不变,未被转换或分词)。此时,必须使用foobar.keyword来对foobar字段以keyword类型进行精确匹配。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。