Elasticsearch 索引

一、简介

在 Elasticsearch 中,索引(Index)是存储相关文档的地方,类似于关系数据库中的数据库。索引是 Elasticsearch 中最重要的概念之一,用于组织和存储数据。

二、索引的基本概念

  • 索引(Index):
    • 索引是 Elasticsearch 中存储相关文档的地方,类似于关系数据库中的数据库。
    • 每个索引有一个唯一的名称,用于标识和访问该索引。
  • 文档(Document):
    • 文档是索引中的基本数据单元,格式为 JSON。每个文档包含多个字段(Fields),字段可以是各种数据类型,如文本、数字、日期等。
    • 文档是 Elasticsearch 中存储和搜索的基本单位。
  • 类型(Type):
    • 在 Elasticsearch 7.x 之前,索引中可以包含多个类型(Types),类似于关系数据库中的表。但在 7.x 及以后版本中,类型已被弃用,每个索引只能包含一种类型,默认类型为 _doc。
  • 分片(Shard):
    • 索引被分成多个分片,每个分片是一个独立的 Lucene 索引。
    • 分片允许数据分布在集群中的多个节点上,从而实现水平扩展和并行处理。
  • 副本(Replica):
    • 每个分片可以有零个或多个副本,副本是分片的拷贝,用于提供高可用性和负载均衡。
    • 副本分片可以与主分片存储在不同的节点上,以防止数据丢失。

三、索引的组成

在 Elasticsearch 中,创建索引时通常包含以下几个主要部分:

  1. 索引名称:唯一标识符。
  2. 设置(Settings):配置分片、副本、分析器等。
  3. 映射(Mappings):定义文档结构和字段类型。
  4. 别名(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 定义了索引的分片、副本、分析器、刷新间隔等核心参数,直接影响索引的性能、可用性和功能。

  1. Settings 的作用

    • 分片和副本:定义索引的分片数和副本数,影响数据的分布和高可用性。
    • 分析器:定义文本字段的分词器和过滤器,影响全文搜索的行为。
    • 刷新和合并策略:控制索引的刷新频率和段合并策略,影响写入性能和查询性能。
    • 其他高级配置:如缓存、压缩、路由等。
  2. Settings 的核心配置项

    • 分片和副本

      • number_of_shards:
        • 定义索引的主分片数量。
        • 分片是 Elasticsearch 分布式存储的基本单位,每个分片是一个独立的 Lucene 索引。
        • 分片数在索引创建时指定,创建后不可更改。
        • 默认值:5。
        • 示例:
          "number_of_shards": 3
          
      • number_of_replicas:
        • 定义每个主分片的副本数量。
        • 副本用于提供高可用性和负载均衡,副本分片可以与主分片存储在不同的节点上。
        • 副本数可以在索引创建后动态调整。
        • 默认值:1。
        • 示例:
          "number_of_replicas": 2
          
    • 分析器(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 秒)。
        • 示例:
        "refresh_interval": "2s"
        
    • 段合并策略(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
        
  3. Settings 的最佳实践

    • 合理设置分片数:
      • 分片数应根据数据量和集群规模合理设置,避免分片过多或过少。
      • 分片过多会增加集群的开销,分片过少会影响查询性能。
    • 动态调整副本数:
      • 副本数可以根据集群的负载和可用性需求动态调整。
    • 优化分析器:
      • 根据业务需求自定义分析器,提升全文搜索的准确性和性能。
    • 调整刷新间隔:
      • 对于实时性要求高的场景,可以缩短刷新间隔;对于写入性能要求高的场景,可以延长刷新间隔。
    • 监控和调优:
      • 定期监控索引的性能和资源使用情况,根据实际需求调整 Settings 配置。
3.3 映射(Mappings)

在 Elasticsearch 中,Mappings(映射) 是定义索引中文档结构及其字段类型的方式。它类似于关系型数据库中的表结构(Schema),用于指定字段的数据类型、分析器、格式等属性。Mappings 是 Elasticsearch 索引的核心组成部分之一,直接影响数据的存储、索引和搜索行为。

  1. Mappings 的作用

    • 定义字段类型:指定每个字段的数据类型(如 text、keyword、date 等)。
    • 控制字段行为:设置字段是否可索引、是否存储、是否支持分词等。
    • 优化搜索性能:通过合理配置字段类型和分析器,提升搜索效率和准确性。
    • 支持复杂数据结构:支持嵌套对象(object)和嵌套类型(nested)等复杂数据结构。
  2. 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:用于存储数组中的嵌套对象(每个对象独立索引)。
  3. 动态映射(Dynamic Mapping)
    Elasticsearch 支持动态映射,即在索引文档时自动推断字段类型。可以通过 dynamic 参数控制动态映射的行为:

    • true:自动添加新字段(默认)。
    • false:忽略新字段。
    • strict:遇到未定义的字段时抛出异常。
    "mappings": {
      "dynamic": "strict",
      "properties": {
    	"title": { "type": "text" }
      }
    }
    
  4. 多字段(Multi-fields)
    多字段允许一个字段以多种方式索引。例如,一个 text 字段可以同时以 text 和 keyword 类型索引:

    "title": {
      "type": "text",
      "fields": {
    	"keyword": {
      	  "type": "keyword"
    	}
      }
    }
    这样,title 字段可以用于全文搜索,而 title.keyword 字段可以用于精确匹配。
    
  5. 嵌套对象(Nested Object)

    "mappings": {
      "properties": {
    	"user": {
      	  "type": "nested",
      	  "properties": {
        	"name": { "type": "text" },
        	"age": { "type": "integer" }
      	  }
    	}
      }
    }
    
  6. Mappings 的最佳实践

    • 合理选择字段类型:
      • 对于需要全文搜索的字段,使用 text 类型。
      • 对于需要精确匹配的字段,使用 keyword 类型。
      • 对于日期字段,使用 date 类型并指定合适的格式。
    • 使用多字段:
      • 对于需要同时支持全文搜索和精确匹配的字段,使用多字段(Multi-fields)。
    • 控制动态映射:
      • 根据需求设置 dynamic 参数,避免不必要的字段自动创建。
    • 优化嵌套对象:
      • 对于嵌套对象,使用 nested 类型以确保每个对象独立索引。
    • 避免过度索引:
      • 对于不需要搜索的字段,设置 index: false 以减少索引开销。
  7. Mappings 的查看和修改

    • 查看 Mappings:
      GET /my_index/_mapping
      
    • 修改 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 请求可以查看索引的详细信息,包括设置、映射、分片等。
      GET /my_index
      
  • 删除索引:

    • 使用 DELETE 请求可以删除一个索引。
      DELETE /my_index
      
  • 更新索引
    在 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" } }
        ]
      }
      
Elasticsearch 索引Elasticsearch 集群的核心组件之一,它负责存储、管理和查询大量数据。在 Elasticsearch 中,索引类似于数据库表的概念,在这里数据按照特定结构组织,并允许快速搜索。 ### Elasticsearch 索引的特点: 1. **结构化存储**:每个文档在索引中都有其唯一标识符 (ID),并且可以包含多种类型的数据,如文本、数字、日期等。文档通常由键值对组成,易于理解与操作。 2. **全文搜索能力**:Elasticsearch 强大之处在于它的全文搜索功能。它能够提供高效的模糊匹配、通配符查询、正则表达式搜索等功能,使得复杂的查询变得简单可行。 3. **分布式设计**:Elasticsearch索引可以分布到集群的多个节点上,实现了水平扩展性和高可用性。这意味着随着数据量的增长,系统性能也能线性提升。 4. **实时操作**:无论是写入还是检索数据,Elasticsearch 提供了非常低的延迟时间。这使其非常适合需要实时响应的应用场景。 5. **内置分析库**:Elasticsearch 内置了一系列强大的分析工具,包括但不限于分词、聚合、过滤等,用于从原始数据中提取有价值的信息。 ### 创建索引: 创建 Elasticsearch 索引的基本步骤包括选择索引名称并指定其配置属性,例如类型、映射规则等。通过 API 或 CLI 工具(如 `curl`),你可以轻松地创建一个新的索引,定义如何存储和搜索数据。 ```bash PUT /my_index_name { "mappings": { "properties": { "title": { "type": "text" }, "content": { "type": "text", "analyzer": "ik_max_word" } } } } ``` 上述命令将创建名为 `my_index_name` 的索引,并定义了一个用于存储文本内容的字段 `title` 和 `content`,其中 `content` 字段使用了自定义的中文分词器。 ### 使用索引: 一旦索引建立,就可以向其中添加(`index`)、更新(`update`)、查询(`search`)、删除(`delete`) 文档。Elasticsearch 提供丰富的 RESTful API 来执行这些操作。 ### 相关问题: 1. **如何优化 Elasticsearch 索引性能?** - 调整分片设置、提高缓存命中率、合理设置字段类型及分析器、实施适当的索引策略等。 2. **如何处理 Elasticsearch 索引的数据迁移?** - 利用 Elasticsearch 的内部工具和脚本进行迁移,或者使用专门的数据复制服务。 3. **Elasticsearch 索引的安全管理措施有哪些?** - 设置安全角色、权限控制、认证机制、数据加密等方式来保护索引数据的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值