马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、简介
在 Elasticsearch 中,索引(Index)是存储相关文档的地方,类似于关系数据库中的数据库。索引是 Elasticsearch 中最重要的概念之一,用于组织和存储数据。
二、索引的基本概念
- 索引(Index):
- 索引是 Elasticsearch 中存储相关文档的地方,类似于关系数据库中的数据库。
- 每个索引有一个唯一的名称,用于标识和访问该索引。
- 文档(Document):
- 文档是索引中的基本数据单位,格式为 JSON。每个文档包罗多个字段(Fields),字段可以是各种数据类型,如文本、数字、日期等。
- 文档是 Elasticsearch 中存储和搜索的基本单位。
- 类型(Type):
- 在 Elasticsearch 7.x 之前,索引中可以包罗多个类型(Types),类似于关系数据库中的表。但在 7.x 及以后版本中,类型已被弃用,每个索引只能包罗一种类型,默认类型为 _doc。
- 分片(Shard):
- 索引被分成多个分片,每个分片是一个独立的 Lucene 索引。
- 分片允许数据分布在集群中的多个节点上,从而实现水平扩展和并行处理。
- 副本(Replica):
- 每个分片可以有零个或多个副本,副本是分片的拷贝,用于提供高可用性和负载均衡。
- 副本分片可以与主分片存储在差别的节点上,以防止数据丢失。
三、索引的组成
在 Elasticsearch 中,创建索引时通常包罗以下几个重要部分:
- 索引名称:唯一标识符。
- 设置(Settings):设置分片、副本、分析器等。
- 映射(Mappings):界说文档结构和字段类型。
- 别名(Aliases,可选):为索引创建虚拟名称。
示例:
- PUT /my_index
- {
- "settings": {
- "number_of_shards": 3
- ,
- "number_of_replicas": 2
- ,
- "refresh_interval": "2s"
- ,
- "analysis": {
- "analyzer": {
- "my_analyzer": {
- "type": "custom",
- "tokenizer": "standard",
- "filter": ["lowercase", "my_filter"]
- }
- },
- "filter": {
- "my_filter": {
- "type": "stop",
- "stopwords": ["and", "the"]
- }
- }
- },
- "merge": {
- "policy": {
- "max_merged_segment": "5gb",
- "segments_per_tier": 10
- }
- },
- "indexing_buffer": "512mb"
- ,
- "codec": "best_compression"
- ,
- "max_result_window": 20000
- },
- "mappings": {
- "properties": {
- "title": {
- "type": "text",
- "analyzer": "my_analyzer"
- },
- "date": {
- "type": "date"
- },
- "author": {
- "type": "keyword"
- },
- "content": {
- "type": "text",
- "analyzer": "my_analyzer"
- },
- "views": {
- "type": "integer"
- }
- }
- },
- "aliases": {
- "my_alias": {}
- }
- }
复制代码 3.1 索引名称
- 索引名称是索引的唯一标识符,用于在集群中辨认该索引。
- 索引名称必须是小写字母,不能包罗特殊字符(如 , /, *, ?, ", <, >, |, , , # 等)。
- 示例:my_index。
3.2 设置(Settings)
在 Elasticsearch 中,Settings(设置) 是创建索引时用于设置索引行为和属性的部分。Settings 界说了索引的分片、副本、分析器、革新间隔等核心参数,直接影响索引的性能、可用性和功能。
- Settings 的作用
- 分片和副本:界说索引的分片数和副本数,影响数据的分布和高可用性。
- 分析器:界说文本字段的分词器和过滤器,影响全文搜索的行为。
- 革新和归并策略:控制索引的革新频率和段归并策略,影响写入性能和查询性能。
- 其他高级设置:如缓存、压缩、路由等。
- Settings 的核心设置项
- 分片和副本
- number_of_shards:
- 界说索引的主分片数量。
- 分片是 Elasticsearch 分布式存储的基本单位,每个分片是一个独立的 Lucene 索引。
- 分片数在索引创建时指定,创建后不可更改。
- 默认值:5。
- 示例:
- number_of_replicas:
- 界说每个主分片的副本数量。
- 副本用于提供高可用性和负载均衡,副本分片可以与主分片存储在差别的节点上。
- 副本数可以在索引创建后动态调整。
- 默认值:1。
- 示例:
- 分析器(Analysis)
- analyzer:
- 界说自界说分析器,用于在索引和搜索时处理文本字段。
- 分析器由分词器(Tokenizer)和过滤器(Filter)组成。
- 示例:
- "analysis": {
- "analyzer": {
- "my_analyzer": {
- "type": "custom",
- "tokenizer": "standard",
- "filter": ["lowercase", "my_filter"]
- }
- },
- "filter": {
- "my_filter": {
- "type": "stop",
- "stopwords": ["and", "the"]
- }
- }
- }
复制代码
- tokenizer:
- 界说分词器,用于将文本拆分为词项(Token)。
- 常见的分词器:standard、whitespace、keyword 等。
- filter:
- 界说过滤器,用于对分词后的词项举行处理。
- 常见的过滤器:lowercase(转换为小写)、stop(去除停用词)、synonym(同义词)等。
- 革新间隔(Refresh Interval)
- refresh_interval:
- 界说索引的革新频率,即新写入的文档在多长时间后可以被搜索到。
- 革新间隔越短,搜索的实时性越高,但写入性能可能下降。
- 默认值:1s(1 秒)。
- 示例:
- 段归并策略(Merge Policy)
- merge.policy:
- 界说 Lucene 段的归并策略,影响索引的写入性能和查询性能。
- 常见的设置项:
- merge.policy.max_merged_segment:最大归并段大小。
- merge.policy.segments_per_tier:每层的段数。
- "merge": {
- "policy": {
- "max_merged_segment": "5gb",
- "segments_per_tier": 10
- }
- }
复制代码
- 写入缓冲区(Indexing Buffer)
- indexing_buffer:
- 界说索引写入缓冲区的大小,影响写入性能。
- 默认值:10% 的 JVM 堆内存。
- 示例:
- "indexing_buffer": "512mb"
复制代码
- 压缩(Compression)
- codec:
- 界说索引数据的压缩算法。
- 常见的压缩算法:default(默认)、best_compression(更高压缩率)。
- 示例:
- "codec": "best_compression"
复制代码
- 路由(Routing)
- routing:
- "routing": {
- "allocation": {
- "include": {
- "region": "us-east"
- }
- }
- }
复制代码
- 其他设置
- max_result_window:
- 界说搜索结果的最大返回条数。
- 默认值:10000。
- 示例:
- "max_result_window": 20000
复制代码
- max_refresh_listeners:
- 界说每个分片的最大革新监听器数量。
- 默认值:1000。
- 示例:
- "max_refresh_listeners": 2000
复制代码
- Settings 的最佳实践
- 合理设置分片数:
- 分片数应根据数据量和集群规模合理设置,避免分片过多或过少。
- 分片过多会增长集群的开销,分片过少会影响查询性能。
- 动态调整副本数:
- 优化分析器:
- 根据业务需求自界说分析器,提升全文搜索的准确性和性能。
- 调整革新间隔:
- 对于实时性要求高的场景,可以紧缩革新间隔;对于写入性能要求高的场景,可以延长革新间隔。
- 监控
和调优:
- 定期监控
索引的性能和资源利用环境,根据现实需求调整 Settings 设置。
3.3 映射(Mappings)
在 Elasticsearch 中,Mappings(映射) 是界说索引中文档结构及其字段类型的方式。它类似于关系型数据库中的表结构(Schema),用于指定字段的数据类型、分析器、格式等属性。Mappings 是 Elasticsearch 索引的核心组成部分之一,直接影响数据的存储、索引和搜索行为。
- Mappings 的作用
- 界说字段类型:指定每个字段的数据类型(如 text、keyword、date 等)。
- 控制字段行为:设置字段是否可索引、是否存储、是否支持分词等。
- 优化搜索性能:通过合理设置字段类型和分析器,提升搜索效率和准确性。
- 支持复杂数据结构:支持嵌套对象(object)和嵌套类型(nested)等复杂数据结构。
- Mappings 的组成部分
- 字段属性(Field Properties)
- type:字段的数据类型(如 text、keyword 等)。
- index:是否索引该字段(true 或 false)。
- analyzer:指定分词器(用于 text 字段)。
- search_analyzer:指定搜索时的分词器。
- store:是否单独存储该字段(true 或 false)。
- format:指定日期格式(用于 date 字段)。
- fields:多字段(Multi-fields),允许一个字段以多种方式索引。
- ignore_above:忽略超过指定长度的字符串(用于 keyword 字段)。
- null_value:为 null 值指定默认值。
- 字段类型(Field Types)
- 常见的字段类型:
- text:全文搜索字段,支持分词。
- keyword:用于准确匹配的字段,不支持分词。
- date:用于存储日期和时间。
- long, integer, short, byte, double, float:用于存储数值。
- boolean:用于存储布尔值(true 或 false)。
- binary:用于存储二进制数据。
- geo_point:用于存储地理坐标(经度和纬度)。
- geo_shape:用于存储复杂的地理形状。
- object:用于存储嵌套的 JSON 对象。
- nested:用于存储数组中的嵌套对象(每个对象独立索引)。
- 动态映射(Dynamic Mapping)
Elasticsearch 支持动态映射,即在索引文档时自动推断字段类型。可以通过 dynamic 参数控制动态映射的行为:
- true:自动添加新字段(默认)。
- false:忽略新字段。
- strict:遇到未界说的字段时抛出非常。
- "mappings": {
- "dynamic": "strict",
- "properties": {
- "title": { "type": "text" }
- }
- }
复制代码
- 多字段(Multi-fields)
多字段允许一个字段以多种方式索引。比方,一个 text 字段可以同时以 text 和 keyword 类型索引:
- "title": {
- "type": "text",
- "fields": {
- "keyword": {
- "type": "keyword"
- }
- }
- }
- 这样,title 字段可以用于全文搜索,而 title.keyword 字段可以用于精确匹配。
复制代码 - 嵌套对象(Nested Object)
- "mappings": {
- "properties": {
- "user": {
- "type": "nested",
- "properties": {
- "name": { "type": "text" },
- "age": { "type": "integer" }
- }
- }
- }
- }
复制代码 - Mappings 的最佳实践
- 合理选择字段类型:
- 对于需要全文搜索的字段,利用 text 类型。
- 对于需要准确匹配的字段,利用 keyword 类型。
- 对于日期字段,利用 date 类型并指定合适的格式。
- 利用多字段:
- 对于需要同时支持全文搜索和准确匹配的字段,利用多字段(Multi-fields)。
- 控制动态映射:
- 根据需求设置 dynamic 参数,避免不必要的字段自动创建。
- 优化嵌套对象:
- 对于嵌套对象,利用 nested 类型以确保每个对象独立索引。
- 避免过度索引:
- 对于不需要搜索的字段,设置 index: false 以淘汰索引开销。
- Mappings 的查看和修改
- 查看 Mappings:
- 修改 Mappings:
- 对于已存在的字段,不能直接修改其类型,但可以添加新字段。
- 如果需要修改字段类型,通常需要重新创建索引并重新索引数据。
3.4 别名(Aliases,可选)
- 别名是一个指向一个或多个索引的虚拟名称,可以用于简化索引管理和查询。
- 别名可以在创建索引时界说,也可以在索引创建后动态添加。
- 示例:
- "aliases": {
- "my_alias": {}
- }
复制代码 四、索引的创建
- 创建索引
- 利用 PUT 请求创建索引,并指定设置和映射。
- 索引创建成功之后,以下属性将不可修改:
下面是一个完整的 Elasticsearch 索引创建示例,包罗设置、映射和别名:
- PUT /my_index{ "settings": { "number_of_shards": 3
- , "number_of_replicas": 2
- , "analysis": { "analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "my_filter"] } }, "filter": { "my_filter": { "type": "stop", "stopwords": ["and", "the"] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "my_analyzer" }, "date": { "type": "date" }, "author": { "type": "keyword", "index": true }, "content": { "type": "text", "analyzer": "my_analyzer" }, "views": { "type": "integer" } } }, "aliases": { "my_alias": {} }}
复制代码 五、索引的操作
- 查看索引:
- 利用 GET 请求可以查看索引的详细信息,包括设置、映射、分片等。
- 删除索引:
- 更新索引
在 Elasticsearch 中,索引一旦创建,其核心结构和设置通常是不可变的,但某些部分是可以动态更新的。
- 索引的设置(Settings)
- 可更新的内容:
- 副本数(number_of_replicas):可以动态调整副本数。
- 革新间隔(refresh_interval):可以动态修改革新间隔。
- 分析器(analyzer):可以为新字段添加分析器,但不能修改现有字段的分析器。
- 不可更新的内容:
- 分片数(number_of_shards):分片数在索引创建后不可更改。
- 主分片的设置:主分片的设置(如分片大小)不可更改。
- PUT /my_index/_settings{ "index": { "number_of_replicas": 2
- , "refresh_interval": "30s" }}
复制代码
- 索引的映射(Mapping)
- 可更新的内容:
- 添加新字段:可以向现有映射中添加新字段。
- 修改字段的多字段(multi-fields):可以为现有字段添加新的多字段类型。
- 不可更新的内容:
- 修改现有字段的类型:比方,不能将 text 类型的字段改为 keyword 类型。
- 删除字段:不能直接删除字段。
- PUT /my_index/_mapping
- {
- "properties": {
- "new_field": {
- "type": "text"
- }
- }
- }
复制代码
- 别名(Aliases)
- 索引别名是一个指向一个或多个索引的虚拟名称。创建索引后,可以随时添加、删除或更新别名。
- 添加别名:为索引添加新的别名。
- 删除别名:移除索引的别名。
- 切换别名:将别名指向另一个索引。
- POST /_aliases
- {
- "actions": [
- { "add": { "index": "my_index", "alias": "my_alias" } }
- ]
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|