使用Elasticsearch映射定义索引结构

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 使用Elasticsearch映射定义索引结构

在Elasticsearch中,**映射(Mapping)**是用于定义索引中文档字段的结构、类型及属性的重要组成部分。它相当于数据库表结构的设计,决定了如何对文档中的数据进行解析、存储和检索。本文将详细介绍映射的概念、支持的常规字段类型、如何忽略映射中不合法的数据、实现字段复制与字段存储,以及动态映射的运用。

映射概念与使用

映射定义了索引中每个字段的名称、类型及其特定属性。在创建索引或向索引中添加文档时,Elasticsearch会自动或手动应用映射规则。以下是一个简单的索引创建示例:

PUT first-index
{
  "settings": {
    "number_of_shards": "5",
    "number_of_replicas": "1"
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      }
    }
  }
}

在这个例子中,我们创建了一个名为first-index的索引,并指定了其分片数和副本数。在mappings部分,定义了一个名为content的字段,类型为text。这样,当我们向该索引添加文档时,Elasticsearch会根据映射规则正确解析和处理content字段的内容。

常规字段类型

Elasticsearch支持多种字段类型以适应不同的数据需求。以下是一些常见的字段类型:

  • text: 用于全文本搜索的字符串类型,会被分词器进行分词处理。
  • keyword: 不分词的字符串类型,用于精确值匹配、排序或聚合。
  • date: 存储日期和时间数据,支持各种格式指定。
  • boolean: 存储布尔值。
  • geo_point: 存储地理坐标信息。
  • integerfloatdouble: 存储数值类型数据。
  • binary: 存储二进制数据。
  • object: 定义嵌套结构,包含多个子字段。
  • array: 存储一组相同类型的值。

例如,定义一个包含userid(text类型)、visittime(date类型,指定时间格式)和sex(boolean类型)的索引映射:

PUT mysougoulog
{
  "mappings": {
    "properties": {
      "userid": {
        "type": "text"
      },
      "visittime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss ||epoch_millis"
      },
      "sex": {
        "type": "boolean"
      }
    }
  }
}

忽略映射中不合法的数据

在某些场景下,可能需要对索引中某些字段的非法数据进行忽略而非导致整个文档插入失败。可以通过设置ignore_malformed属性来实现这一功能:

PUT ignore-test
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "born": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss",
        "ignore_malformed": true
      }
    }
  }
}

在上述映射中,born字段被设置为忽略不合法数据。当插入包含非法born值的文档时,Elasticsearch会忽略该字段的错误值并继续处理其他字段。

字段复制与字段存储

字段复制

通过copy_to属性,可以将一个或多个字段的值复制到另一个字段,便于进行全局搜索或其他复杂查询。例如,创建一个索引,将titleauthorabstract字段的值复制到full_text字段:

PUT copy-field
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "copy_to": "full_text"
      },
      "author": {
        "type": "text",
        "copy_to": "full_text"
      },
      "abstract": {
        "type": "text",
        "copy_to": "full_text"
      },
      "full_text": {
        "type": "text"
      }
    }
  }
}

现在,可以通过查询full_text字段来同时搜索titleauthorabstract的内容:

POST copy-field/_search
{
  "query": {
    "match": {
      "full_text": "smith"
    }
  }
}

字段存储

默认情况下,Elasticsearch只存储原始文档的源数据和用于搜索的倒排索引。如果需要在搜索结果中直接返回某个字段的值,可以设置store属性为true,使字段值被持久化存储到磁盘:

PUT copy-store-field
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "copy_to": "full_text"
      },
      "author": {
        "type": "text",
        "copy_to": "full_text"
      },
      "abstract": {
        "type": "text",
        "copy_to": "full_text"
      },
      "full_text": {
        "type": "text",
        "store": true
      }
    }
  }
}

查询时,使用stored_fields参数指定要返回的已存储字段:

POST copy-store-field/_search
{
  "stored_fields": ["full_text"]
}

动态映射

Elasticsearch具有动态映射功能,当索引中出现未事先定义的字段时,会自动为其创建映射。这在处理未知结构或快速迭代的数据时非常有用。例如,尝试向一个新索引date-test中添加一条包含create_date字段的文档:

PUT date-test/_doc/1
{
  "create_date": "2015/09/02 00:00:00"
}

查询映射信息,可以看到Elasticsearch已自动为create_date字段创建了映射:

GET date-test/_mapping

若需要自定义动态映射的行为,如指定日期格式,可以在创建索引时设置dynamic_date_formats属性:

PUT date-test2
{
  "mappings": {
    "dynamic_date_formats": ["yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"]
  }
}

总结起来,Elasticsearch的映射机制为索引结构提供了强大的灵活性和控制力。通过合理设计映射,可以优化数据存储、提升搜索性能,并确保数据的一致性和完整性。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
2天前
|
索引
利用滚动索引来管理海量Elasticsearch数据
利用滚动索引来管理海量Elasticsearch数据
10 3
|
2天前
|
数据库 索引
Elasticsearch索引别名:管理与优化数据访问
Elasticsearch索引别名:管理与优化数据访问
7 2
|
4天前
|
存储 监控 固态存储
elasticsearch索引生命周期管理(ILM):原理和实践
elasticsearch索引生命周期管理(ILM):原理和实践
|
4天前
|
存储 JSON API
Elasticsearch中的模板:定义、作用与实践
Elasticsearch中的模板:定义、作用与实践
|
4天前
|
存储 监控 数据挖掘
Elasticsearch 别名:灵活索引管理的利器
Elasticsearch 别名:灵活索引管理的利器
|
11天前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
81 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
|
2天前
|
存储 自然语言处理 关系型数据库
Elasticsearch如何修改Mapping结构并实现业务零停机
Elasticsearch如何修改Mapping结构并实现业务零停机
|
2天前
|
存储 JSON 监控
Elasticsearch索引监控全面解析
Elasticsearch索引监控全面解析
7 0
|
2天前
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
6 0
|
2天前
|
数据安全/隐私保护 网络架构 索引
Elasticsearch索引数据的路由规则与自定义路由分发
Elasticsearch索引数据的路由规则与自定义路由分发
5 0