赞
踩
Elasticsearch是一个分布式、实时的搜索和分析引擎,适用于全文搜索、结构化搜索和分析等场景。为了实现高性能的搜索和分析功能,Elasticsearch采用了一种称为索引的数据结构,并通过映射机制定义了数据的结构和处理方式。本文将详细介绍Elasticsearch中的索引和映射机制,包括字段类型、分析器、过滤器和令牌生成器等。
在Elasticsearch中,索引是一种用于存储和管理数据的数据结构。每个索引由一个或多个分片组成,每个分片可以有零个或多个副本。索引中的数据以文档的形式存储,每个文档包含一组字段和其对应的值。
映射是一种用于定义索引中文档结构的元数据,包括字段名称、字段类型和字段属性等。映射机制允许Elasticsearch根据数据的结构和处理方式,为查询和分析提供更高的性能和灵活性。
在Elasticsearch中,字段类型用于定义字段的数据类型和处理方式。字段类型决定了如何存储和索引字段值,以及如何在查询和聚合操作中使用这些值。以下是一些常用的字段类型:
文本类型用于存储全文数据,如文章、评论等。文本字段会被分析器处理,以便进行全文搜索。分析器将文本数据分解为令牌,以便在查询时进行匹配。文本字段支持全文搜索和模糊匹配,但不适用于排序和聚合操作。
关键字类型用于存储非全文数据,如标签、分类等。关键字字段不会被分析器处理,因此适用于精确匹配和聚合操作。关键字字段支持精确匹配、范围查询、排序和聚合操作,但不适用于全文搜索和模糊匹配。
数值类型用于存储数值数据,如年龄、价格等。数值字段支持范围查询、排序和聚合操作。Elasticsearch提供了多种数值类型,如integer
(32位整数)、long
(64位整数)、float
(32位浮点数)和double
(64位浮点数),以满足不同精度和存储需求。
日期类型用于存储日期和时间数据,如发布时间、更新时间等。日期字段支持范围查询、排序和聚合操作。Elasticsearch可以自动识别多种日期和时间格式,如2021-01-01
、2021-01-01T12:34:56
等。此外,还可以通过format
参数自定义日期和时间格式。
布尔类型用于存储布尔值,如是否可用、是否已删除等。布尔字段支持精确匹配、范围查询和聚合操作。
二进制类型用于存储二进制数据,如图片、文件等。二进制字段不支持搜索和分析操作,仅用于存储和检索原始数据。在Elasticsearch中,二进制数据需要使用Base64编码进行存储。
Elasticsearch还支持一些复杂类型,如对象(object)、嵌套(nested)和地理位置(geo_point、geo_shape)等。这些类型用于存储和查询复杂数据结构,如JSON对象、地理坐标等。
在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
字段指定了日期格式。
分析器是一种用于处理文本数据的组件,包括字符过滤器、令牌生成器和令牌过滤器等。在Elasticsearch中,分析器用于将文本字段分解为令牌,以便进行全文搜索和分析。
分析器的工作流程如下:
字符过滤器用于处理文本数据中的字符,如去除HTML标签、转换大小写等。在Elasticsearch中,可以使用预定义的字符过滤器,也可以自定义字符过滤器。
以下是一些常用的预定义字符过滤器:
html_strip
:去除HTML标签和实体。lowercase
:将文本数据转换为小写。pattern_replace
:使用正则表达式替换文本数据中的字符。令牌生成器用于将文本数据分解为令牌,如按空格分词、按标点符号分词等。在Elasticsearch中,可以使用预定义的令牌生成器,也可以自定义令牌生成器。
以下是一些常用的预定义令牌生成器:
standard
:按Unicode文本分割规则分词。whitespace
:按空格字符分词。keyword
:将整个文本数据作为一个令牌。ngram
:生成指定长度范围的n-gram令牌。edge_ngram
:生成指定长度范围的边缘n-gram令牌。令牌过滤器用于处理生成的令牌,如去除停用词、生成同义词等。在Elasticsearch中,可以使用预定义的令牌过滤器,也可以自定义令牌过滤器。
以下是一些常用的预定义令牌过滤器:
lowercase
:将令牌转换为小写。stop
:去除停用词。synonym
:生成同义词。stemmer
:提取词干。asciifolding
:将Unicode字符转换为等效的ASCII字符。在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
(去除停用词)。
映射配置是一种用于定义索引中文档结构的元数据,包括字段名称、字段类型和字段属性等。映射配置允许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
字段指定了日期格式。
在映射配置中,可以为字段定义多种属性,以控制字段的存储、索引和查询方式。以下是一些常用的字段属性:
type
:字段的数据类型,如text
、keyword
、date
等。analyzer
:用于处理文本字段的分析器,如standard
、whitespace
等。format
:用于解析和格式化日期字段的日期格式,如strict_date_optional_time
、epoch_millis
等。index
:字段是否可被索引。默认为true
,表示字段可被搜索;设置为false
,表示字段不可被搜索,但仍可被存储和检索。store
:字段是否单独存储。默认为false
,表示字段值存储在_source
字段中;设置为true
,表示字段值单独存储,可用于排序和聚合操作。在Elasticsearch中,可以使用动态映射功能自动为新字段创建映射配置。动态映射根据字段值的类型和格式,自动推断字段的数据类型和属性。
动态映射功能可以通过以下设置进行控制:
dynamic
:动态映射的行为。默认为true
,表示自动创建映射配置;设置为false
,表示忽略新字段;设置为strict
,表示抛出异常。dynamic_templates
:动态映射的模板。可以为不同类型的字段定义不同的映射配置,如设置text
字段的分析器、设置date
字段的日期格式等。本文详细介绍了Elasticsearch中的索引和映射机制,包括字段类型、分析器、过滤器和令牌生成器等。了解这些概念有助于您充分利用Elasticsearch的高性能特性,从而满足实时分析和大数据处理的需求。通过合理地配置映射和分析器,可以显著提高搜索和分析性能,降低系统负载,并为您的业务带来更好的体验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。