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-01
、2021-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中,分析器用于将文本字段分解为令牌,以便进行全文搜索和分析。
分析器的工作流程如下:
- 首先,字符过滤器处理输入的文本数据,如去除HTML标签、转换大小写等。
- 接着,令牌生成器将处理后的文本数据分解为令牌,如按空格分词、按标点符号分词等。
- 最后,令牌过滤器处理生成的令牌,如去除停用词、生成同义词等。
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标签,保留b
和i
标签)、一个令牌生成器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
:字段的数据类型,如text
、keyword
、date
等。analyzer
:用于处理文本字段的分析器,如standard
、whitespace
等。format
:用于解析和格式化日期字段的日期格式,如strict_date_optional_time
、epoch_millis
等。index
:字段是否可被索引。默认为true
,表示字段可被搜索;设置为false
,表示字段不可被搜索,但仍可被存储和检索。store
:字段是否单独存储。默认为false
,表示字段值存储在_source
字段中;设置为true
,表示字段值单独存储,可用于排序和聚合操作。
4.3 动态映射
在Elasticsearch中,可以使用动态映射功能自动为新字段创建映射配置。动态映射根据字段值的类型和格式,自动推断字段的数据类型和属性。
动态映射功能可以通过以下设置进行控制:
dynamic
:动态映射的行为。默认为true
,表示自动创建映射配置;设置为false
,表示忽略新字段;设置为strict
,表示抛出异常。dynamic_templates
:动态映射的模板。可以为不同类型的字段定义不同的映射配置,如设置text
字段的分析器、设置date
字段的日期格式等。
5. 总结
本文详细介绍了Elasticsearch中的索引和映射机制,包括字段类型、分析器、过滤器和令牌生成器等。了解这些概念有助于您充分利用Elasticsearch的高性能特性,从而满足实时分析和大数据处理的需求。通过合理地配置映射和分析器,可以显著提高搜索和分析性能,降低系统负载,并为您的业务带来更好的体验。