浅谈Elasticsearch索引与映射机制

Elasticsearch索引与映射机制

Elasticsearch是一个分布式、实时的搜索和分析引擎,适用于全文搜索、结构化搜索和分析等场景。为了实现高性能的搜索和分析功能,Elasticsearch采用了一种称为索引的数据结构,并通过映射机制定义了数据的结构和处理方式。本文将详细介绍Elasticsearch中的索引和映射机制,包括字段类型、分析器、过滤器和令牌生成器等。

1. 索引与映射概述

在Elasticsearch中,索引是一种用于存储和管理数据的数据结构。每个索引由一个或多个分片组成,每个分片可以有零个或多个副本。索引中的数据以文档的形式存储,每个文档包含一组字段和其对应的值。

映射是一种用于定义索引中文档结构的元数据,包括字段名称、字段类型和字段属性等。映射机制允许Elasticsearch根据数据的结构和处理方式,为查询和分析提供更高的性能和灵活性。

2. 字段类型

在Elasticsearch中,字段类型用于定义字段的数据类型和处理方式。字段类型决定了如何存储和索引字段值,以及如何在查询和聚合操作中使用这些值。以下是一些常用的字段类型:

2.1 文本(text)

文本类型用于存储全文数据,如文章、评论等。文本字段会被分析器处理,以便进行全文搜索。分析器将文本数据分解为令牌,以便在查询时进行匹配。文本字段支持全文搜索和模糊匹配,但不适用于排序和聚合操作。

2.2 关键字(keyword)

关键字类型用于存储非全文数据,如标签、分类等。关键字字段不会被分析器处理,因此适用于精确匹配和聚合操作。关键字字段支持精确匹配、范围查询、排序和聚合操作,但不适用于全文搜索和模糊匹配。

2.3 数值(integer、long、float、double)

数值类型用于存储数值数据,如年龄、价格等。数值字段支持范围查询、排序和聚合操作。Elasticsearch提供了多种数值类型,如integer(32位整数)、long(64位整数)、float(32位浮点数)和double(64位浮点数),以满足不同精度和存储需求。

2.4 日期(date)

日期类型用于存储日期和时间数据,如发布时间、更新时间等。日期字段支持范围查询、排序和聚合操作。Elasticsearch可以自动识别多种日期和时间格式,如2021-01-012021-01-01T12:34:56等。此外,还可以通过format参数自定义日期和时间格式。

2.5 布尔(boolean)

布尔类型用于存储布尔值,如是否可用、是否已删除等。布尔字段支持精确匹配、范围查询和聚合操作。

2.6 二进制(binary)

二进制类型用于存储二进制数据,如图片、文件等。二进制字段不支持搜索和分析操作,仅用于存储和检索原始数据。在Elasticsearch中,二进制数据需要使用Base64编码进行存储。

2.7 复杂类型

Elasticsearch还支持一些复杂类型,如对象(object)、嵌套(nested)和地理位置(geo_point、geo_shape)等。这些类型用于存储和查询复杂数据结构,如JSON对象、地理坐标等。

2.8 字段类型配置

在Elasticsearch中,可以通过映射配置来定义字段类型。以下是一个映射配置的示例:

{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "tags": {
        "type": "keyword"
      },
      "publish_date": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      },
      "price": {
        "type": "float"
      },
      "is_available": {
        "type": "boolean"
      },
      "location": {
        "type": "geo_point"
      },
      "author": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "email": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

在这个示例中,我们定义了一个包含title(文本类型)、tags(关键字类型)、publish_date(日期类型)、price(浮点数类型)、is_available(布尔类型)、location(地理位置类型)和author(对象类型)字段的映射配置。同时,我们为title字段指定了standard分析器,为publish_date字段指定了日期格式。

3. 分析器

3.1 分析器概述

分析器是一种用于处理文本数据的组件,包括字符过滤器、令牌生成器和令牌过滤器等。在Elasticsearch中,分析器用于将文本字段分解为令牌,以便进行全文搜索和分析。

分析器的工作流程如下:

  1. 首先,字符过滤器处理输入的文本数据,如去除HTML标签、转换大小写等。
  2. 接着,令牌生成器将处理后的文本数据分解为令牌,如按空格分词、按标点符号分词等。
  3. 最后,令牌过滤器处理生成的令牌,如去除停用词、生成同义词等。

3.2 字符过滤器

字符过滤器用于处理文本数据中的字符,如去除HTML标签、转换大小写等。在Elasticsearch中,可以使用预定义的字符过滤器,也可以自定义字符过滤器。

以下是一些常用的预定义字符过滤器:

  • html_strip:去除HTML标签和实体。
  • lowercase:将文本数据转换为小写。
  • pattern_replace:使用正则表达式替换文本数据中的字符。

3.3 令牌生成器

令牌生成器用于将文本数据分解为令牌,如按空格分词、按标点符号分词等。在Elasticsearch中,可以使用预定义的令牌生成器,也可以自定义令牌生成器。

以下是一些常用的预定义令牌生成器:

  • standard:按Unicode文本分割规则分词。
  • whitespace:按空格字符分词。
  • keyword:将整个文本数据作为一个令牌。
  • ngram:生成指定长度范围的n-gram令牌。
  • edge_ngram:生成指定长度范围的边缘n-gram令牌。

3.4 令牌过滤器

令牌过滤器用于处理生成的令牌,如去除停用词、生成同义词等。在Elasticsearch中,可以使用预定义的令牌过滤器,也可以自定义令牌过滤器。

以下是一些常用的预定义令牌过滤器:

  • lowercase:将令牌转换为小写。
  • stop:去除停用词。
  • synonym:生成同义词。
  • stemmer:提取词干。
  • asciifolding:将Unicode字符转换为等效的ASCII字符。

3.5 分析器配置

在Elasticsearch中,可以通过映射配置来定义分析器。以下是一个分析器配置的示例:

{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_html_strip": {
          "type": "html_strip",
          "escaped_tags": ["b", "i"]
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 3
        }
      },
      "filter": {
        "my_stopwords": {
          "type": "stop",
          "stopwords": ["the", "and", "is"]
        }
      },
      "analyzer": {
        "my_custom_analyzer": {
          "char_filter": ["my_html_strip"],
          "tokenizer": "my_ngram_tokenizer",
          "filter": ["lowercase", "my_stopwords"]
        }
      }
    }
  }
}

在这个示例中,我们定义了一个自定义分析器my_custom_analyzer,包括一个字符过滤器my_html_strip(去除HTML标签,保留bi标签)、一个令牌生成器my_ngram_tokenizer(生成2-3个字符的n-gram令牌)和一个令牌过滤器my_stopwords(去除停用词)。

4. 映射配置

4.1 映射配置概述

映射配置是一种用于定义索引中文档结构的元数据,包括字段名称、字段类型和字段属性等。映射配置允许Elasticsearch根据数据的结构和处理方式,为查询和分析提供更高的性能和灵活性。

在Elasticsearch中,可以通过PUT请求创建或更新映射配置。以下是一个映射配置的示例:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      },
      "tags": {
        "type": "keyword"
      },
      "publish_date": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      },
      "price": {
        "type": "float"
      },
      "is_available": {
        "type": "boolean"
      }
    }
  }
}

在这个示例中,我们创建了一个名为my_index的索引,并定义了一个包含title(文本类型)、tags(关键字类型)、publish_date(日期类型)、price(浮点数类型)和is_available(布尔类型)字段的映射配置。同时,我们为title字段指定了standard分析器,为publish_date字段指定了日期格式。

4.2 字段属性

在映射配置中,可以为字段定义多种属性,以控制字段的存储、索引和查询方式。以下是一些常用的字段属性:

  • type:字段的数据类型,如textkeyworddate等。
  • analyzer:用于处理文本字段的分析器,如standardwhitespace等。
  • format:用于解析和格式化日期字段的日期格式,如strict_date_optional_timeepoch_millis等。
  • index:字段是否可被索引。默认为true,表示字段可被搜索;设置为false,表示字段不可被搜索,但仍可被存储和检索。
  • store:字段是否单独存储。默认为false,表示字段值存储在_source字段中;设置为true,表示字段值单独存储,可用于排序和聚合操作。

4.3 动态映射

在Elasticsearch中,可以使用动态映射功能自动为新字段创建映射配置。动态映射根据字段值的类型和格式,自动推断字段的数据类型和属性。

动态映射功能可以通过以下设置进行控制:

  • dynamic:动态映射的行为。默认为true,表示自动创建映射配置;设置为false,表示忽略新字段;设置为strict,表示抛出异常。
  • dynamic_templates:动态映射的模板。可以为不同类型的字段定义不同的映射配置,如设置text字段的分析器、设置date字段的日期格式等。

5. 总结

本文详细介绍了Elasticsearch中的索引和映射机制,包括字段类型、分析器、过滤器和令牌生成器等。了解这些概念有助于您充分利用Elasticsearch的高性能特性,从而满足实时分析和大数据处理的需求。通过合理地配置映射和分析器,可以显著提高搜索和分析性能,降低系统负载,并为您的业务带来更好的体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值