elasticsearch 的字符串动态映射
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
映射用来定义文档及其字段如何被存储和索引,文档写入 es 时,es 可根据写入内容的类型自动识别,这种机制就是动态映射(Dynamic field mapping),本文关注的是写入内容为字符串时,该内容被识别的字段类型;
环境信息
操作系统:Ubuntu 18.04.2 LTS
elasticsearch:6.7.1
kibana:6.7.1
官网解释
来自官网的解释,如下图,地址是:https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html
官网的解释为:
如果是日期类型,就映射为 date;
如果是数字,就映射为 double 或者 long;
否则就是 text,并且还会带上 keyword 子类型;
映射为 text 好理解,但是带上 keyword 子类型怎么理解呢?应该是达到静态绑定的映射参数 fields 效果,让该字段有两种索引方式,这样可以用 text 类型做全文检索,再用 keyword 类型做聚合和排序;
接下来实战验证:
创建文档
在 Kibana 上执行以下命令,创建索引、类型、一个文档:
再创建一条:
检查动态映射结果
执行命令 GET book/_mapping 查看动态映射结果,字符串动态映射后,字段类型为 text,但是都有了 fields 参数,里面是 keyword 的子类型:
验证检索
执行以下检索命令验证检索:
第一条记录都可以搜索到,证明 description 字段已经被分词和索引了;
title 字段还有一种索引方式 keyword,也来试试,查 keyword 是要用完整内容做查询条件的,如下:
得到的结果如下,没有记录:
这是怎么回事呢?对于这种 sub-field 的查询,不能直接使用 title,而是要用 title.keyword,改成如下请求:
这次顺利查到:
验证聚合
执行以下命令,以 language 字段进行分组,统计每个分组的文档数:
得到结果如下,可以成功统计 language 字段为 java 的文档数量为 2,可见动态映射给 language 设定的 keyword 类型能够直接用于聚合(text 类型不能直接用于聚合,会返回 status=400 错误,修改参数后可以将 text 类用于聚合,但是会消耗更多内存资源):
以上就是字符串在动态映射逻辑中的结果和验证,您使用动态映射的过程中,如果在词项查询和聚合等操作中遇到疑惑,希望本文能提供些参考;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/96f7fba685fa24a09c78b481e】。文章转载请联系作者。
评论