ES 关于text和keyword两种类型数据搜索区别
Posted 悟能的师兄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES 关于text和keyword两种类型数据搜索区别相关的知识,希望对你有一定的参考价值。
ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,
string字段被拆分成两种新的数据类型: text用于全文搜索的,而keyword用于关键词搜索。
1、ES 关于text和keyword两种类型
ElasticSearch字符串将默认被同时映射成text和keyword类型,将会自动创建下面的动态映射。
通过 GET /dist_test/_mapping/field/weixin_number 命令查看 weixin_number 字段数据类型,可以看到 mapping 下除了 text 还有 keyword。两者有什么区别呢?
"dist_test" :
"mappings" :
"weixin" :
"weixin_number" :
"full_name" : "weixin_number",
"mapping" :
"weixin_number" :
"type" : "text",
"fields" :
"keyword" :
"type" : "keyword",
"ignore_above" : 256
1.1 text:
- 会分词,然后进行索引
- 支持模糊、精确查询
- 不支持聚合
- 分词器默认standard ,对于中文来说就是按字分词
- 支持fields属性,可以在fields中添加keyword子类型,以实现精确检索
1.2 keyword:
- 不进行分词,直接索引
- 支持模糊、精确查询
- 支持聚合
- 支持按字数建立索引,以便节约索引空间
- 看下text分词规律。
1.2.1、纯小写字符串
GET /dist_test/_analyze
"field": "weixin_number",
"text": "vicky1176320626"
1.2.2、包含大写字母字符串会全部转换为小写。
GET /dist_test/_analyze
"field": "weixin_number",
"text": "XP3412"
1.2.3、包含特殊符号,如空格、-,则会分词为多个字符串。
GET /dist_test/_analyze
"field": "weixin_number",
"text": "AAAA-95533"
这也是某些情况下,term 查询后查询不到数据的原因。解决方案也很简单,使用 keyword 精确查询即可。
如例:针对Text类型的数据,要使用term查询
"from": 0,
"size": 10,
"query":
"bool":
"must": [
"term":
"city.keyword":
"value": "湖南省长沙市",
"boost": 1
],
"adjust_pure_negative": true,
"boost": 1
以上是关于ES 关于text和keyword两种类型数据搜索区别的主要内容,如果未能解决你的问题,请参考以下文章
ElasticSearchES5新特性-keyword-text类型-查询区别
es版本2.x的string和5.x的keyword,text的区别和联系
Elasticsearch es nested 嵌套类型 详解
Elastic Search 浅浅认识 快速使用 keyword 和 text 的区别之处 spring boot 集成案例 es 增删改查