写点什么

elasticsearch 的字符串动态映射

作者:程序员欣宸
  • 2022 年 9 月 06 日
    广东
  • 本文字数:2913 字

    阅读完需:约 10 分钟

elasticsearch的字符串动态映射

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


  • 映射用来定义文档及其字段如何被存储和索引,文档写入 es 时,es 可根据写入内容的类型自动识别,这种机制就是动态映射(Dynamic field mapping),本文关注的是写入内容为字符串时,该内容被识别的字段类型;

环境信息

  1. 操作系统:Ubuntu 18.04.2 LTS

  2. elasticsearch:6.7.1

  3. kibana:6.7.1

官网解释



  • 官网的解释为:


  1. 如果是日期类型,就映射为 date;

  2. 如果是数字,就映射为 double 或者 long;

  3. 否则就是 text,并且还会带上 keyword 子类型


  • 映射为 text 好理解,但是带上 keyword 子类型怎么理解呢?应该是达到静态绑定的映射参数 fields 效果,让该字段有两种索引方式,这样可以用 text 类型做全文检索,再用 keyword 类型做聚合和排序;

  • 接下来实战验证:

创建文档

  • 在 Kibana 上执行以下命令,创建索引、类型、一个文档:


PUT book/es/101{"title":"Elasticsearch IN ACTION","language":"java","author":"Radu Gheorghe","price":58.80,"publish_time":"2018-10-01","description":"本书主要展示如何使用Elasticsearch构建可扩展的搜索应用程序。"}
复制代码


  • 再创建一条:


PUT book/es/102{"title":"ELK Stack权威指南 ","language":"java","author":"拉斐尔·酷奇","price":62.40,"publish_time":"2017-05-01","description":"本书涵盖了Elasticsearch的许多中高级功能。"}
复制代码

检查动态映射结果

  • 执行命令 GET book/_mapping 查看动态映射结果,字符串动态映射后,字段类型为 text,但是都有了 fields 参数,里面是 keyword 的子类型:


{  "book" : {    "mappings" : {      "es" : {        "properties" : {          "author" : {            "type" : "text",            "fields" : {              "keyword" : {                "type" : "keyword",                "ignore_above" : 256              }            }          },          "description" : {            "type" : "text",            "fields" : {              "keyword" : {                "type" : "keyword",                "ignore_above" : 256              }            }          },          "language" : {            "type" : "text",            "fields" : {              "keyword" : {                "type" : "keyword",                "ignore_above" : 256              }            }          },          "price" : {            "type" : "float"          },          "publish_time" : {            "type" : "date"          },          "title" : {            "type" : "text",            "fields" : {              "keyword" : {                "type" : "keyword",                "ignore_above" : 256              }            }          }        }      }    }  }}
复制代码

验证检索

  • 执行以下检索命令验证检索:


GET book/_search{  "query": {    "match": {"title":"Elasticsearch"}  }}
复制代码


  • 第一条记录都可以搜索到,证明 description 字段已经被分词和索引了;

  • title 字段还有一种索引方式 keyword,也来试试,查 keyword 是要用完整内容做查询条件的,如下:


GET book/_search{  "query": {    "term": {"title":"Elasticsearch IN ACTION"}  }}
复制代码


  • 得到的结果如下,没有记录


{  "took" : 0,  "timed_out" : false,  "_shards" : {    "total" : 5,    "successful" : 5,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : 0,    "max_score" : null,    "hits" : [ ]  }}
复制代码


  • 这是怎么回事呢?对于这种 sub-field 的查询,不能直接使用 title,而是要用 title.keyword,改成如下请求:


GET book/_search{  "query": {    "term": {"title.keyword":"Elasticsearch IN ACTION"}  }}
复制代码


  • 这次顺利查到:


{  "took" : 0,  "timed_out" : false,  "_shards" : {    "total" : 5,    "successful" : 5,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : 1,    "max_score" : 0.2876821,    "hits" : [      {        "_index" : "book",        "_type" : "es",        "_id" : "101",        "_score" : 0.2876821,        "_source" : {          "title" : "Elasticsearch IN ACTION",          "language" : "java",          "author" : "Radu Gheorghe",          "price" : 58.8,          "publish_time" : "2018-10-01",          "description" : "本书主要展示如何使用Elasticsearch构建可扩展的搜索应用程序。"        }      }    ]  }}
复制代码

验证聚合

  • 执行以下命令,以 language 字段进行分组,统计每个分组的文档数:


GET book/_search{  "aggs": {    "per_count": {      "terms":{        "field":"language.keyword"      }
} }}
复制代码


  • 得到结果如下,可以成功统计 language 字段为 java 的文档数量为 2,可见动态映射给 language 设定的 keyword 类型能够直接用于聚合(text 类型不能直接用于聚合,会返回 status=400 错误,修改参数后可以将 text 类用于聚合,但是会消耗更多内存资源):


{  "took" : 2,  "timed_out" : false,  "_shards" : {    "total" : 5,    "successful" : 5,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : 2,    "max_score" : 1.0,    "hits" : [      {        "_index" : "book",        "_type" : "es",        "_id" : "101",        "_score" : 1.0,        "_source" : {          "title" : "Elasticsearch IN ACTION",          "language" : "java",          "author" : "Radu Gheorghe",          "price" : 58.8,          "publish_time" : "2018-10-01",          "description" : "本书主要展示如何使用Elasticsearch构建可扩展的搜索应用程序。"        }      },      {        "_index" : "book",        "_type" : "es",        "_id" : "102",        "_score" : 1.0,        "_source" : {          "title" : "ELK Stack权威指南 ",          "language" : "java",          "author" : "拉斐尔·酷奇",          "price" : 62.4,          "publish_time" : "2017-05-01",          "description" : "本书涵盖了Elasticsearch的许多中高级功能。"        }      }    ]  },  "aggregations" : {    "per_count" : {      "doc_count_error_upper_bound" : 0,      "sum_other_doc_count" : 0,      "buckets" : [        {          "key" : "java",          "doc_count" : 2        }      ]    }  }}
复制代码


  • 以上就是字符串在动态映射逻辑中的结果和验证,您使用动态映射的过程中,如果在词项查询和聚合等操作中遇到疑惑,希望本文能提供些参考;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022 年 09 月 06 日阅读数: 27
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
elasticsearch的字符串动态映射_elasticsearch_程序员欣宸_InfoQ写作社区