使用Elasticsearch在同一索引中区分不同类型的文档

在使用Elasticsearch时,有时我们需要在同一个索引中存放不同类型的文档,并且这些文档的字段可能不一致。在早期版本中,我们可以使用types来实现,但在Elasticsearch 7.x及更高版本中,types概念已被弃用。本文将介绍如何在新的版本中使用标识字段和索引别名来实现这一需求。

一、创建索引和添加映射

首先,我们需要创建一个索引,并定义映射以包含不同类型文档的字段。

json 复制代码
PUT /my_test_index
{
  "mappings": {
    "properties": {
      "doc_type": { "type": "keyword" },
      "field1": { "type": "text" },
      "field2": { "type": "integer" },
      "fieldA": { "type": "text" },
      "fieldB": { "type": "date" }
    }
  }
}

参考官方文档:Mapping - Elasticsearch

二、添加文档

接下来,我们添加一些文档,并在每个文档中使用doc_type字段来标识文档类型。以下是一些包含假数据的文档示例:

json 复制代码
POST /my_test_index/_doc/1
{
  "doc_type": "type1",
  "field1": "值1",
  "field2": 10
}

POST /my_test_index/_doc/2
{
  "doc_type": "type2",
  "fieldA": "值A",
  "fieldB": "2023-06-16"
}

POST /my_test_index/_doc/3
{
  "doc_type": "type1",
  "field1": "值2",
  "field2": 20
}

POST /my_test_index/_doc/4
{
  "doc_type": "type2",
  "fieldA": "值B",
  "fieldB": "2023-06-17"
}

参考官方文档:Create Index - Elasticsearch

三、使用标识字段进行查询

在创建别名之前,我们可以直接使用doc_type字段进行查询:

查询类型为type1的文档:

json 复制代码
GET /my_test_index/_search
{
  "query": {
    "term": { "doc_type": "type1" }
  }
}

查询类型为type2的文档:

json 复制代码
GET /my_test_index/_search
{
  "query": {
    "term": { "doc_type": "type2" }
  }
}

参考官方文档:Query DSL - Elasticsearch

四、创建索引别名并添加过滤器

为了方便查询,我们可以为索引创建别名,并为别名添加过滤器,这样可以在逻辑上将一个索引分成多个"虚拟索引"。

json 复制代码
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "my_test_index",
        "alias": "type1_index",
        "filter": { "term": { "doc_type": "type1" } }
      }
    },
    {
      "add": {
        "index": "my_test_index",
        "alias": "type2_index",
        "filter": { "term": { "doc_type": "type2" } }
      }
    }
  ]
}

参考官方文档:Index Aliases - Elasticsearch

五、查询文档

我们可以使用别名来查询不同类型的文档,这样可以有效地区分和管理不同类型的数据。

查询类型为type1的文档:

json 复制代码
GET /type1_index/_search
{
  "query": {
    "match_all": {}
  }
}

查询类型为type2的文档:

json 复制代码
GET /type2_index/_search
{
  "query": {
    "match_all": {}
  }
}
六、对比新的做法和老的做法

在Elasticsearch 6.x及之前版本中,我们可以使用types来区分不同类型的文档:

json 复制代码
PUT /my_index
{
  "mappings": {
    "type1": {
      "properties": {
        "field1": { "type": "text" },
        "field2": { "type": "integer" }
      }
    },
    "type2": {
      "properties": {
        "fieldA": { "type": "text" },
        "fieldB": { "type": "date" }
      }
    }
  }
}

然而,在Elasticsearch 7.x中,types概念被移除了,推荐使用标识字段和索引别名的方式来管理和区分不同类型的文档。

老的做法: 使用多个types在同一个索引中区分文档。优点是直观且易于管理,但已被弃用。

新的做法: 使用标识字段和索引别名来管理不同类型的文档。优点是符合最新的Elasticsearch版本,灵活性更高,但需要在文档设计和查询时额外注意区分。

如果对你有帮助的话点个赞呗~

相关推荐
小猴子爱上树4 分钟前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
W***25925 分钟前
2026 企业 AI 办公工具选型指南:能力评估与平台全景分析
大数据·人工智能
2601_9672127225 分钟前
电源轨道系统核心技术路线对比与选型要点
大数据·经验分享
vx_Biye_Design1 小时前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
龙亘川1 小时前
数智赋能物业不动产治理:亘川智城智慧物业系统实践解析
大数据·人工智能·智慧城市·开源软件·数据可视化
大大大大晴天️2 小时前
元数据目录到数据资产运营:让好数据被看见、被复用、被持续经营
大数据·数据治理
Elastic 中国社区官方博客2 小时前
错误最多的服务运行正常:使用 ES|QL 从日志进行根因分析
大数据·运维·数据库·sql·elasticsearch·搜索引擎·全文检索
计算机毕业设计杰瑞2 小时前
【2027最新精品大数据】基于大数据的全国各地景点指数数据可视化分析,附源码_高质量项目_可视化_数据分析_毕设选题推荐_SPark_Hadoop_毕设指导
大数据·信息可视化·数据分析
计算机毕业设计杰瑞3 小时前
【2027精品大数据项目】基于大数据的全球太空探索数据分析与可视化,附源码_数据可视化_数据分析_毕设选题_SPark_Hadoop_文档指导ppt
大数据·信息可视化·数据挖掘·课程设计
计算机毕业编程指导师3 小时前
【计算机毕设推荐】基于Hadoop+Django的LLM多维度性能评估分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·django·毕业设计·课程设计·llm性能