关于ES字符串类型(Text vs keyword)的选择

云计算/大数据 专栏收录该内容
1 篇文章 0 订阅

关于ES字符串类型的选择

ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型text用于全文搜索的,keyword用于关键词搜索。

ElasticSearch字符串将默认被同时映射成textkeyword类型,将会自动创建下面的动态映射(dynamic mappings):

{

    "foo": {

        "type": "text",

        "fields": {

            "keyword": {

                "type": "keyword",

                "ignore_above": 256

            }

        }

    }

}

这就是造成部分字段还会自动生成一个与之对应的“.keyword”字段的原因。

Text vs. keyword

Text:会分词,然后进行索引

       支持模糊、精确查询

       不支持聚合

keyword:不进行分词,直接索引

       支持模糊、精确查询

       支持聚合

 

由于接口中有的需要源字段,而有的需要keyword字段,需要前后端做判断,十分繁琐且很难保持接口统一。

 

测试

Mapping

{

    "order": 0,

    "version": 50001,

    "template": "test",

    "settings": {

        "index": {

            "refresh_interval": "5s"

        }

    },

    "mappings": {

        "website": {

            "_all": {

                "norms": false,

                "enabled": true

            },

            "properties": {

                "@timestamp": {

                    "include_in_all": false,

                    "type": "date"

                },

                "keytrue": {

                    "index": true,

                    "type": "keyword"

                },

                "keyfalse": {

                    "index": false,

                    "type": "keyword"

                },

                "textfalse": {

                    "index": false,

                    "type": "text"

                },

                "texttrue": {

                    "index": true,

                    "type": "text"

                }

            }

        }

    },

    "aliases": {}

}

Data

PUT /test/test/1

{

  "@timestamp":1511147712941,

  "keytrue":"test keytrue",

  "keyfalse":"test keyfalse",

  "texttrue":"test texttrue",

  "textfalse":"test textfalse"

}

Index Patterns

name

type

format

searchable

aggregatable

keyfalse  

string

 

 

keytrue  

string

 

textfalse  

string

 

 

 

textfalse.keyword  

string

 

texttrue  

string

 

 

texttrue.keyword  

string

 

搜索结果

条件

结果

keytrue : "test keytrue"

keytrue : "test"

 

keyfalse

 

textfalse

 

textfalse.keyword : "test textfalse"

textfalse.keyword : "test"

 

texttrue : "test texttrue"

texttrue : "test"

texttrue.keyword : "test texttrue "

texttrue.keyword : "test"

 

 

结论

keyword类型满足目前系统的需求,且能保证接口统一,所以建议将查询、聚合中涉及的字符串类型,在mapping中设置为“keyword”。

  • 7
    点赞
  • 4
    评论
  • 17
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值