前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[Elasticsearch] ES 的Mapping 设计在实际场景中应用

[Elasticsearch] ES 的Mapping 设计在实际场景中应用

作者头像
awwewwbbb
发布于 2021-12-27 00:29:50
发布于 2021-12-27 00:29:50
68500
代码可运行
举报
运行总次数:0
代码可运行

背景

项目中有个需求是需要几个字段作为标签,统计各个标签的文档数量,同时支持分词后的全文检索功能。

原有的mapping设计:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPUT http://ip:9200/meta_es_metric_data -d'

{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 0
  },
  "mappings": {
    "meta_metric": {
      "properties": {
        "metricCode": {
          "type": "text",
           "analyzer" : "ik_max_word"
        },
        "metricTechType": {
          "type": "keyword"
        },
        "dataDomainName": {
          "type": "keyword"
        },
        "sceneClassify": {
          "type": "keyword"
        },
        "metricClassify": {
          "type": "keyword"
        }
      }
    }
  }
}'

其中keyword类型就是作为标签统计字段,因为其类型不支持分词检索,检索时必须精确查找,我们尝试把其类型修改成text,text本身就是支持分词索引,但是修改后就报错了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Fielddata is disabled on text fields by default 

经过查询了解es一个字段类型被设置为text,再进行聚合统计,就会报上面的问题.

那么ES有没有办法对一个字段支持分词检索同时可以进行统计的特性呢?其实就是ES是否可以一个字段定义两种类型: keyword 和 text?

答案是可以的.

ES字段的fields属性

通过fields属性来让当前字段同时具备keyword和text类型

由于我们本身的字段类型是keyword,那我在field 属性中添加一个text,是否就满足需求呢?如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPUT http://ip:9200/meta_es_metric_data -d'

{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 0
  },
  "mappings": {
    "meta_metric": {
      "properties": {
        "metricCode": {
          "type": "text",
           "analyzer" : "ik_max_word"
        },
        "metricTechType": {
          "type": "keyword"
          fields": {
                "raw": { 
                   "type":  "text"
             }
          }
        }
      }
    }
  }
}'

当用match 搜索metricTechType.raw, 分词搜索是不行的。

之所以想这样做是因为ES支持新增字段、更新字段,但是不支持字段类型的修改

这条方法走不通,就比较复杂了,因为考虑修改字段类型,我们只能重建mapping, 同时涉及历史数据的加载处理。

具体步骤

1.重建索引,因es不支持修改字段类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPUT http://ip:9200/meta_es_metric_data_new -d'

{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 0
  },
  "mappings": {
    "meta_metric": {
      "properties": {
        "metricCode": {
          "type": "text",
           "analyzer" : "ik_max_word"
        },
    
        "metricTechType": {
          "type": "text",
           "fields": {
                    "raw": { 
                      "type":  "keyword"
             }
          }
        },

        "dataDomainName": {
          "type": "text",
           "fields": {
                    "raw": { 
                   "type":  "keyword"
             }
          }
        },

        "sceneClassify": {
          "type": "text",
          "fields": {
                    "raw": { 
                   "type":  "keyword"
             }
          }
        },

        "metricClassify": {
          "type": "text",
          "fields": {
                    "raw": { 
                    "type":  "keyword"
             }
          }
        }
      }
    }
  }
}'

2.查看索引映射

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XGET  'http://ip:9200/meta_es_metric_data_new/_mapping'

3.将数据加载到新的索引上(老索引的数据还是在的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPOST http://ip:9200/_reindex -d'
{
    "source":{
       "index": "meta_es_metric_data"
    },

    "dest": {
        "index": "meta_es_metric_data_new"
    }
    
}'

4.查看老索引数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XGET 'http://ip:9200/meta_es_metric_data/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "dataDomainName": "用户"
    }
  }
}
'

5.删除原索引,给新索引创建别名(为了代码不动)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XDELETE http://ip:9200/meta_es_metric_data

curl -XPOST http://ip:9200/_aliases -d'
{
    "actions":[
        {
           "add": {
                "index": "meta_es_metric_data_new",
                "alias": "meta_es_metric_data"
           }

        }
    ]
    
}'

6.测试字段是否支持全文检索及聚合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XGET 'http://ip:9200/meta_es_metric_data_new/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "dataDomainName": "用户"
    }
  },
  "sort": {
    "dataDomainName.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "dataDomainName.raw"
      }
    }
  }
}
'

总结

本文主要讲解如何让一个字段支持不同方式索引,利用Fields属性. 同时如何对历史存量数据进行处理. keyword类型支持es精确查找以及聚合排序,text支持全文检索,但是不能进行聚合、排序.

参考

  1. https://doc.codingdict.com/elasticsearch/330/
  2. https://cloud.tencent.com/developer/article/1555004
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
elasticsearch中mapping全解实战
?原文地址为https://www.cnblogs.com/haixiang/p/12040272.html,转载请注明出处! ?es与java的整合以及常用CRUD、搜索API已被作者封装,开箱即
海向
2019/12/17
1.2K0
3.ElasticSearch分布式数据分析引擎基础概念与使用
描述: ES是支持以及HTTP协议进行REST风格接口访问,一般得我们需要有个工具帮我们发送http请求,该工具常见的是curl英 [kɜːl]、Head插件、Kibana DeveloperTool软件等。
全栈工程师修炼指南
2022/09/29
2K0
3.ElasticSearch分布式数据分析引擎基础概念与使用
ElasticSearch入门
    全文搜索属于最常见的需求,开源的 Elasticsearch是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 ElasticSearch 的底层是开源库 Lucene,Elasticsearch 是 Lucene 的封装,它提供了 REST API 的操作接口,开箱即用。
Java架构师必看
2021/05/14
1.2K0
elasticsearch 分词
安装中文、拼音分词 https://github.com/medcl/elasticsearch-analysis-ik https://github.com/medcl/elasticsearch-analysis-pinyin 下载和elasticsearch对应的版本,解压后移到plugins目录 root@57d58faf9b1e:/usr/share/elasticsearch/plugins# ls ik pinyin 重启elasticsearch使生效 测试一下 默认分词 curl -H
崔哥
2022/05/25
3310
使用CURL命令操作ES
使用CURL命令操作ES 当前文档所用ES版本 6.4.3 ElasticSearch 提供了一系列的Restful风格的API,我们可以使用curl命令进行使用,也可以在kibana中使用。 Restful风格 它是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。 RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。通过不同的请求方法来实现不同的功能。 GET 获取数据 POS
趣学程序-shaofeer
2019/09/19
14.9K0
使用CURL命令操作ES
Elasticsearch学习(五)Elasticsearch中的mapping问题,Search 搜索详解
Mapping在Elasticsearch中是非常重要的一个概念。决定了一个index中的field使用什么数据格式存储,使用什么分词器解析,是否有子字段等。
一写代码就开心
2021/03/02
1.8K0
Elasticsearch学习(五)Elasticsearch中的mapping问题,Search 搜索详解
ElasticSearch构建全文搜索系统
Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎,通过它我们可以构建出一个强大的全文搜索系统,解决诸如文章检索慢,商品检索慢、MySQL的like查询慢这样的问题。 Elasticsearch是基于hadoop创始人道哥的另一杰作Lucene实现的,速度非常快,核心是使用了倒排索引这样的结构。 接下来,就以这篇倒排索引中的例子,演示一下ElasticSearch的使用
IT苦逼一枚
2020/03/25
1.3K0
Elasticsearch的CRU
近端时间在搬砖过程中对es进行了操作,但是对es查询文档不熟悉,所以这两周都在研究es,简略看了《Elasticsearch权威指南》,摸摸鱼又是一天。
Liusy
2020/09/01
4550
Elasticsearch的CRU
012.Elasticsearch基础API入门以及term与match综合测试
当向一个不存在的index中添加document时,可以自动创建索引,也可以根据传入的数据自动创建mapping,ES也会自动对这些文档进行倒排索引
CoderJed
2020/06/19
7800
ElasticSearch快速入门【建议收藏】
ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用head插件来测试,目的是对ES的使用方法及流程有个初步的认识。
码农编程进阶笔记
2022/06/29
5030
ElasticSearch快速入门【建议收藏】
在Elasticsearch中查询Term Vectors词条向量信息
这篇文章有点深度,可能需要一些Lucene或者全文检索的背景。由于我也很久没有看过Lucene了,有些地方理解的不对还请多多指正。 更多内容还请参考整理的ELK教程 关于Term Vectors 额,对于这个专业词汇,暂且就叫做词条向量吧,因为实在想不出什么标准的翻译。说的土一点,也可以理解为关于词的一些统计信息。再说的通俗点,如果想进行全文检索,即从一个词搜索与它相关的文档,总得有个什么记录的信息吧!这就是Term Vectors。 为了不干扰正常的理解,后续就都直接称呼英文的名字吧!免得误导..
用户1154259
2018/01/17
2.8K0
干货 | Elasticsearch 索引设计实战指南
随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。
铭毅天下
2020/02/20
10.3K0
ElasticSearch系列18:Mapping 设计指南
ElasticSearch 的 mapping 该如何设计,才能保证检索的高效?想要回答这个问题,就需要全面系统地掌握 mapping 各种参数的含义以及其适用的场景。(ps:本文基于ElasticSearch 7.7.1)
方才编程_公众号同名
2020/11/13
1.6K0
ElasticSearch系列18:Mapping 设计指南
【Elasticsearch】Rest风格API
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
陶然同学
2023/02/24
1.1K0
【Elasticsearch】Rest风格API
Elasticsearch一些使用笔记(持续更新)
template机制是比较有用的,特别是管理大量索引的时候。先给一个template的demo。
用户1225216
2019/05/25
5780
ES常用操作--postman实现
A multi-bucket value source based aggregation that enables the user to define a set of ranges-每个代表一个bucket。
伍六七AI编程
2019/10/08
1.3K0
ES常用操作--postman实现
Elasticsearch调优实践
本文基于ES 5.6.4,从性能和稳定性两方面,从linux参数调优、ES节点配置和ES使用方式三个角度入手,介绍ES调优的基本方案。当然,ES的调优绝不能一概而论,需要根据实际业务场景做适当的取舍和调整,文中的疏漏之处也随时欢迎批评指正。
技术姐
2018/07/04
13.9K3
Elasticsearch调优实践
Windows下ElasticSearch学习(二)
今天继续学习ES 在Windows 下的使用,主要是通过curl 命令行来操作ES: 备注:说明一下ES 的版本为6.8.8.
Wu_Candy
2022/07/04
2630
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
墨墨导读:本文介绍了ElasticSearch的必备知识:从入门、索引管理到映射详解。
数据和云
2019/08/12
3.2K0
ElasticSearch最全详细使用教程:入门、索引管理、映射详解
Elasticsearch调优实践
在规模比较大的集群中,可以防止新建shard时扫描所有shard的元数据,提升shard分配速度。
HLee
2021/02/08
5890
Elasticsearch调优实践
相关推荐
elasticsearch中mapping全解实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档