elasticsearch的字符串动态映射

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在使用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
        }
      ]
    }
  }
}
  • 以上就是字符串在动态映射逻辑中的结果和验证,您使用动态映射的过程中,如果在词项查询和聚合等操作中遇到疑惑,希望本文能提供些参考;

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
5月前
|
存储 自然语言处理 数据库
使用Elasticsearch映射定义索引结构
使用Elasticsearch映射定义索引结构
|
4月前
|
自然语言处理 关系型数据库 数据库
ElasticSearch 映射类型及数据类型区分
ElasticSearch 映射类型及数据类型区分
52 0
|
5月前
|
存储 JSON 定位技术
深入理解Elasticsearch的索引映射(mapping)
深入理解Elasticsearch的索引映射(mapping)
|
自然语言处理 关系型数据库 定位技术
分布式系列教程(35) -ElasticSearch文档映射
分布式系列教程(35) -ElasticSearch文档映射
73 0
|
6月前
|
数据采集 机器学习/深度学习 自然语言处理
Elasticsearch 8.X 如何动态的为正文添加摘要字段?
Elasticsearch 8.X 如何动态的为正文添加摘要字段?
43 0
|
6月前
|
JSON Java API
Elasticsearch进阶使用-动态模版
Elasticsearch进阶使用-动态模版
71 0
|
存储 SQL 缓存
|
存储 JSON 自然语言处理
九.全文检索ElasticSearch经典入门-ElasticSearch映射修改
九.全文检索ElasticSearch经典入门-ElasticSearch映射修改
下一篇
无影云桌面