最近其实有点忙,在主攻Django项目和go语言项目,所以只能利用下班晚上和周末总结一些知识点,因为最近的公司的项目没有用上Elasticsearch,所以总结一下,方便以后复习,以及以后面试会用上,不然过段时间,这些知识点都遗忘了。
目录
[1.Elasticsearch 的定义](#1.Elasticsearch 的定义)
[2. Elasticsearch数据类型概览](#2. Elasticsearch数据类型概览)
4.Elasticsearch映射(Mapping)和索引(Index)设置
[5.Elasticsearch查询DSL(Domain Specific Language)](#5.Elasticsearch查询DSL(Domain Specific Language))
[6. Elasticsearch聚合(Aggregations)操作](#6. Elasticsearch聚合(Aggregations)操作)
7.Elasticsearch高亮(Highlighting))
[8. Elasticsearch排序(Sorting)](#8. Elasticsearch排序(Sorting))
[9. Elasticsearch索引刷新与写入性能](#9. Elasticsearch索引刷新与写入性能)
[10. Elasticsearch安全与权限(Security and Authorization)](#10. Elasticsearch安全与权限(Security and Authorization))
[11. Elasticsearch监控与日志(Monitoring and Logging)](#11. Elasticsearch监控与日志(Monitoring and Logging))
[12.Elasticsearch集群管理(Cluster Management)](#12.Elasticsearch集群管理(Cluster Management))
[13.Elasticsearch索引别名(index Alias)](#13.Elasticsearch索引别名(index Alias))
[14.Elasticsearch索引末班与模式(Index Templates and Patterns)](#14.Elasticsearch索引末班与模式(Index Templates and Patterns))
[15. Elasticsearch搜索操作(Search Operations)](#15. Elasticsearch搜索操作(Search Operations))
[16.Elasticsearch批量操作(Bulk Operations)](#16.Elasticsearch批量操作(Bulk Operations))
[17.Elasticsearch搜索结果解析(Search Result Parsing)](#17.Elasticsearch搜索结果解析(Search Result Parsing))
[18.Elasticsearch插件生态系统(Plugins Ecosystem)](#18.Elasticsearch插件生态系统(Plugins Ecosystem))
[19. Elasticsearch集群状态与维护](#19. Elasticsearch集群状态与维护)
[20. Elasticsearch灾难恢复与备份](#20. Elasticsearch灾难恢复与备份)
1.Elasticsearch 的定义
Elasticsearch 是一个分布式、RESTful 风格的搜索与数据分析引擎。它可以用于全文搜索、结构化搜索以及分析;Elasticsearch 可以被用于构建实时搜索引擎,如电商网站的产品搜索功能。
2. Elasticsearch数据类型概览
数据类型分类 | 数据类型 | 描述 | 示例 |
---|---|---|---|
核心数据类型 | string (text/keyword) | text 用于全文搜索,keyword 用于精确匹配。 |
"content": {"type": "text"} |
核心数据类型 | numeric | 包括 byte , short , integer , long 等。 |
"age": {"type": "integer"} |
核心数据类型 | date | 日期类型,用于存储日期和时间。 | "date": {"type": "date"} |
核心数据类型 | boolean | 布尔类型,用于存储真值或假值。 | `"is_published": {"type": "boolean"} |
核心数据类型 | binary | 二进制数据类型。 | "file": {"type": "binary"} |
范围数据类型 | range | 包括 integer_range , float_range , date_range 等。 |
"age_range": {"type": "integer_range"} |
复杂数据类型 | object | 用于存储结构化数据,如 JSON 对象。 | "user": {"type": "object"} |
复杂数据类型 | nested | 嵌套对象,允许对内嵌数据进行索引和搜索。 | "comments": {"type": "nested"} |
地理数据类型 | geo_point | 存储地理位置的经纬度。 | "location": {"type": "geo_point"} |
地理数据类型 | geo_shape | 存储地理形状,如多边形。 | "shape": {"type": "geo_shape"} |
专门数据类型 | ip | 用于存储 IP 地址。 | "ip": {"type": "ip"} |
专门数据类型 | token_count | 用于统计字段中的词项数量。 | "word_count": {"type": "token_count"} |
专门数据类型 | completion | 用于自动完成功能的字段。 | "suggest": {"type": "completion"} |
3.Elasticsearch的分析器(Analyzers)和分词器(Tokenizer)
组件 | 描述 | 示例 |
---|---|---|
分析器(Analyzer) | 用于将文本转换为可搜索的项(tokens)。包括字符过滤器、分词器和词元过滤器。 | "analyzer": {"my_custom_analyzer": {"type": "standard"}} |
分词器(Tokenizer) | 将文本分解成单个或多个词条(terms)。 | "tokenizer": {"my_custom_tokenizer": {"type": "whitespace"}} |
词元过滤器(Token Filter) | 对分词器生成的词条进行转换或修改。 | "filter": {"my_custom_filter": {"type": "lowercase"}} |
标准分析器(Standard Analyzer) | 默认分析器,适用于大多数文本。 | "analyzer": {"default": {"type": "standard"}} |
简单分析器(Simple Analyzer) | 基于词元的边界分词,不使用词元过滤器。 | "analyzer": {"my_simple_analyzer": {"type": "simple"}} |
停用词过滤(Stop Token Filter) | 移除常见的停用词,如"and"、"the"等。 | "filter": {"my_stop_filter": {"type": "stop", "stopwords": ["and", "the"]}} |
分析器在索引文档时用于文本字段的分析,Tokenizer 用于将文本分解成词条,而 Token Filter 用于进一步处理这些词条,例如小写化、同义词处理或删除停用词。
示例:
假设我们有一个博客平台,需要对用户提交的帖子内容进行索引,以便于后续的搜索。我们可能会定义一个自定义分析器,如下所示:
css
PUT /my_blog_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "standard",
"stopwords": ["a", "an", "the"] // 自定义停用词列表
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_custom_analyzer"
}
}
}
}
在这个示例中,我们创建了一个名为 my_blog_index
的新索引,并定义了一个自定义的标准分析器 my_custom_analyzer
,它使用了一个自定义的停用词列表。然后,我们将这个分析器应用到了 content
字段上。
4.Elasticsearch映射(Mapping)和索引(Index)设置
概念 | 描述 | 示例 |
---|---|---|
映射(Mapping) | 定义文档中每个字段的数据类型和相关的属性,如是否可搜索、是否存储等。 | "mappings": {"properties": {"title": {"type": "text"}}} |
索引(Index) | 存储数据的结构,类似于关系型数据库中的"表"。 | "settings": {"index": {"number_of_shards": 3}}} |
分片(Shards) | 一个索引可以被分成多个分片以分布数据和提高查询性能。 | 如上例 |
副本(Replicas) | 每个分片可以有多个副本以提供高可用性和读取性能。 | "settings": {"index": {"number_of_replicas": 2}}} |
全文搜索(Full-Text Search) | 利用 text 类型字段进行全文搜索。 |
"query": {"match": {"content": "Elasticsearch"}} |
精确搜索(Exact Search) | 利用 keyword 类型字段进行精确匹配搜索。 |
"query": {"term": {"category.keyword": "finance"}} |
多字段(Multi-fields) | 一个字段可以定义为多个类型的字段,以支持不同的搜索需求。 | "properties": {"title": {"type": "text", "fields": {"raw": {"type": "keyword"}}}} |
示例:
假设我们正在设计一个新闻文章的索引,并且我们希望文章的标题能够支持全文搜索,同时支持基于标题的精确匹配搜索,如下所示:
css
PUT /news_index
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 2
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"content": {
"type": "text"
},
"publication_date": {
"type": "date"
},
"category": {
"type": "keyword"
}
}
}
}
在这个示例中,我们创建了一个名为 news_index
的新索引,并设置了3个主分片和2个副本。文章的 title
字段被定义为 text
类型以支持全文搜索,并且通过 fields
定义了一个名为 raw
的子字段,它是 keyword
类型,用于支持精确匹配搜索。content
字段同样被定义为 text
类型,而 publication_date
和 category
分别被定义为 date
和 keyword
类型。
5.Elasticsearch查询DSL(Domain Specific Language)
查询类型 | 描述 | 示例 |
---|---|---|
Match Query | 用于在 text 类型字段上执行全文搜索。 |
"query": {"match": {"content": "Elasticsearch"}} |
Term Query | 用于在 keyword 类型字段上执行精确值匹配。 |
"query": {"term": {"category.keyword": "finance"}} |
Range Query | 用于查找数值或日期类型字段在指定范围内的文档。 | "query": {"range": {"age": {"gte": 18}}} |
Bool Query | 组合多个查询,支持 must , should , must_not , filter 。 |
"query": {"bool": {"must": [{"match": {"content": "Elasticsearch"}}]}} |
Prefix Query | 用于查找以特定前缀开始的 text 或 keyword 类型字段的文档。 |
"query": {"prefix": {"title.keyword": "fin"}} |
Wildcard Query | 支持使用通配符(* 和 ?)进行搜索。 | "query": {"wildcard": {"user.keyword": "j*"}} |
Fuzzy Query | 允许搜索拼写错误的词条。 | "query": {"fuzzy": {"title.keyword": "elasticsearche"}} |
Regexp Query | 使用正则表达式进行搜索。 | "query": {"regexp": {"title.keyword": "elast.*"}} |
Aggregations | 用于执行数据分析和统计。 | "aggs": {"avg_price": {"avg": {"field": "price"}}} |
示例:
假设我们想要在新闻文章索引中搜索有关 "Elasticsearch" 的文章,并且希望结果按照发布日期排序,同时获取这些文章的平均阅读量:
css
GET /news_index/_search
{
"query": {
"match": {
"content": "Elasticsearch"
}
},
"sort": [
{
"publication_date": {
"order": "desc"
}
}
],
"aggs": {
"average_article_views": {
"avg": {
"field": "article_views"
}
}
}
}
在这个示例中,我们使用了 match
查询来搜索包含 "Elasticsearch" 的文章。sort
用于按照 publication_date
字段降序排序结果。aggs
中的 average_article_views
聚合用于计算所有匹配文档的平均阅读量
6. Elasticsearch聚合(Aggregations)操作
聚合类型 | 描述 | 示例 |
---|---|---|
Avg | 计算数值字段的平均值。 | "aggs": {"avg_price": {"avg": {"field": "price"}}} |
Sum | 计算数值字段的总和。 | "aggs": {"total_sales": {"sum": {"field": "price"}}} |
Min | 找出数值字段的最小值。 | "aggs": {"min_price": {"min": {"field": "price"}}} |
Max | 找出数值字段的最大值。 | "aggs": {"max_price": {"max": {"field": "price"}}} |
Stats | 计算数值字段的多个统计值,包括最小值、最大值、平均值和总和。 | "aggs": {"price_stats": {"stats": {"field": "price"}}} |
Extended Stats | 提供额外的统计度量,如标准偏差和方差。 | "aggs": {"price_extended_stats": {"extended_stats": {"field": "price"}}} |
Value Count | 计算字段中不重复值的数量。 | "aggs": {"unique_titles": {"value_count": {"field": "title.keyword"}}} |
Terms | 对字段的唯一值进行聚合,通常用于桶聚合。 | "aggs": {"categories": {"terms": {"field": "category.keyword"}}} |
Range | 根据指定的范围对数值或日期字段进行分组。 | "aggs": {"price_ranges": {"range": {"field": "price", "ranges": [{"from": 0, "to": 100}, {"from": 100, "to": 200}]}} |
Date Histogram | 按日期范围对日期字段进行分组,通常用于时间序列数据。 | "aggs": {"publication_years": {"date_histogram": {"field": "publication_date", "calendar_interval": "year"}}}} |
Nested | 对嵌套对象内的文档执行聚合。 | "aggs": {"nested_agg": {"nested": {"path": "comments"}, "aggs": {"avg_score": {"avg": {"field": "comments.score"}}}}} |
示例:
假设我们有一个电子商务网站的索引,我们想要聚合出所有商品的平均价格、总销量以及按类别分桶的统计信息:
css
GET /ecommerce_index/_search
{
"size": 0, // 不返回匹配的文档,只返回聚合结果
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
},
"total_sales": {
"sum": {
"field": "sales"
}
},
"categories_stats": {
"terms": {
"field": "category.keyword"
},
"aggs": {
"avg_price_per_category": {
"avg": {
"field": "price"
}
}
}
}
}
}
在这个示例中,我们使用 avg
聚合来计算所有商品的平均价格,使用 sum
聚合来计算总销量。同时,我们使用 terms
聚合按商品类别进行分组,并在每个桶内使用嵌套的 avg
聚合来计算每个类别商品的平均价格。
7.Elasticsearch高亮(Highlighting)
高亮类型 | 描述 | 示例 |
---|---|---|
高亮查询(Highlight Query) | 用于在返回的搜索结果中突出显示匹配的部分。 | "highlight": {"fields": {"content": {}}} |
前缀高亮(Prefix Highlight) | 与高亮查询类似,但可以为每个词条添加前缀。 | "highlight": {"pre_tags": ["<tag1>"], "post_tags": ["</tag1>"], "fields": {"content": {"pre_tags": ["[H]"], "post_tags": ["[/H]"]}}} |
高亮器(Highlighter) | 指定用于高亮的算法或方法。 | "highlight": {"highlighter": "fvh", "fields": {"content": {}}} |
自定义高亮(Custom Highlight) | 允许自定义高亮的前缀和后缀标签。 | "highlight": {"pre_tags": ["<custom>"], "post_tags": ["</custom>"], "fields": {"content": {}}} |
多字段高亮(Multi-field Highlight) | 对文档中的多个字段进行高亮。 | "highlight": {"fields": {"content": {}, "title": {}}} |
示例:
假设我们正在搜索有关 "Elasticsearch" 的文章,并且我们希望在搜索结果中的内容字段和标题字段中高亮显示匹配的词条:
css
GET /news_index/_search
{
"query": {
"match": {
"content": "Elasticsearch"
}
},
"highlight": {
"pre_tags": ["<highlight>"],
"post_tags": ["</highlight>"],
"fields": {
"content": {},
"title": {}
}
}
}
在这个示例中,我们使用了 match
查询来搜索包含 "Elasticsearch" 的文章。highlight
部分定义了自定义的高亮前缀 <highlight>
和后缀 </highlight>
,并指定了要高亮的字段 content
和 title
。
8. Elasticsearch排序(Sorting)
排序类型 | 描述 | 示例 |
---|---|---|
普通排序(Simple Sort) | 根据一个字段进行升序或降序排序。 | "sort": {"price": {"order": "asc"}} |
多级排序(Multi-level Sort) | 可以基于多个字段进行排序,类似于 SQL 中的 ORDER BY 。 |
"sort": [{"price": {"order": "asc"}}, {"_score": {"order": "desc"}}] |
脚本排序(Script Sort) | 使用脚本进行排序,提供排序的灵活性。 | "sort": {"_script": {"script": {"lang": "painless", "source": "doc['price'].value"}}} |
地理距离排序(Geo Distance Sort) | 根据与地理点的距离进行排序。 | "sort": {"_geo_distance": {"location": [40.73, -74.1], "order": "asc", "unit": "km"}} |
示例:
假设我们想要搜索新闻文章,并按照文章的发布日期进行降序排序,同时在分数相同的情况下按照文章标题的字典顺序进行升序排序:
css
GET /news_index/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"publication_date": {
"order": "desc"
}
},
{
"title.keyword": {
"order": "asc"
}
}
]
}
在这个示例中,我们使用了 match_all
查询来搜索所有文档,并按照 publication_date
字段进行降序排序,然后对于排序结果相同的文档,按照 title.keyword
字段进行升序排序。
9. Elasticsearch索引刷新与写入性能
概念 | 描述 | 示例 |
---|---|---|
索引刷新(Index Refresh) | 控制索引操作何时变为可见,影响搜索性能。 | "settings": {"index": {"refresh_interval": "1m"}} |
写入性能(Write Performance) | 优化写入性能,包括批量操作和写入合并。 | 使用 bulk API 进行批量索引操作 |
合并(Merge) | 控制索引的后台合并操作,影响存储和搜索性能。 | "settings": {"index": {"merge.policy": {"floor_segment": "50mb"}}} |
存储类型(Storage Type) | 索引的存储类型,影响索引的读写性能。 | "settings": {"index": {"store": {"type": "mmapfs"}}} |
索引存储(Index Store) | 控制索引元数据的存储方式,优化性能。 | "settings": {"index": {"store": {"index": {"store": "niofs"}}}} |
强制合并(Force Merge) | 强制立即合并所有分片,用于优化存储使用。 | POST /index_name/_forcemerge |
示例:
假设我们有一个日志索引,我们希望减少索引的刷新间隔,以便更快地看到新的搜索结果:
css
PUT /log_index
{
"settings": {
"index": {
"refresh_interval": "5s" // 刷新间隔设置为5秒
}
}
}
在这个示例中,我们将 refresh_interval
设置为5秒,这样索引操作会在每5秒后变为可见,从而加快搜索结果的更新速度。
10. Elasticsearch安全与权限(Security and Authorization)
功能 | 描述 | 示例 |
---|---|---|
角色(Roles) | 定义一组权限,可以分配给一个或多个用户。 | POST /_security/role/marketing_role |
用户(Users) | 创建具有特定角色的用户账户。 | POST /_security/user/john |
权限(Privileges) | 控制用户对索引和文档的操作权限,如读(read)、写(write)和删除(delete)。 | 在角色中指定权限:".indices": {"privileges": ["read", "write"]} |
认证(Authentication) | 验证用户身份的过程,通常使用 X-Pack 或内置的基本认证。 | 通过 HTTP 基本认证与 Elasticsearch 通信 |
授权(Authorization) | 根据用户的角色和权限控制对资源的访问。 | 分配用户到具有特定索引权限的角色 |
TLS/SSL | 用于加密节点间和客户端与 Elasticsearch 集群之间的通信。 | 在配置文件中设置 xpack.security.transport.ssl.enabled |
审计日志(Audit Logs) | 记录安全事件,如用户登录、权限变更等。 | 启用审计日志:xpack.security.audit.enabled |
示例:
假设我们需要创建一个角色,该角色具有读取特定索引和写入日志的能力:
css
POST /_security/role/marketing_role
{
"cluster": ["read"],
"indices": [
{
"names": ["marketing_data"],
"privileges": ["read", "write"]
}
]
}
定索引 marketing_data
的读写权限。
接下来,我们将创建一个用户并分配上面定义的角色:
css
POST /_security/user/john
{
"password": "password123",
"roles": ["marketing_role"],
"full_name": "xiaomifeng1010"
}
在这个示例中,我们创建了一个用户名为 xiaomifeng1010 的用户,设置了密码,并分配了 marketing_role
角色。
11. Elasticsearch监控与日志(Monitoring and Logging)
功能 | 描述 | 示例 |
---|---|---|
节点监控(Node Monitoring) | 跟踪集群中每个节点的状态和性能指标。 | 使用 Elasticsearch 自带的 _cat API,如 _cat/nodes?v |
集群监控(Cluster Monitoring) | 监控整个 Elasticsearch 集群的健康和性能。 | 使用 Elasticsearch 头插件(Elasticsearch Head)或 Kibana |
日志管理(Log Management) | 记录和查看 Elasticsearch 节点的日志信息。 | 访问节点的日志文件,通常位于 /var/log/elasticsearch/ |
慢查询日志(Slow Query Logs) | 记录执行时间较长的查询,有助于性能调优。 | 配置 index.search.slowlog.threshold.query.warn |
审计日志(Audit Logs) | 记录安全事件,如用户操作、权限变更等。 | 通过 X-Pack 安全功能启用审计日志 |
Deprecation Logging | 记录弃用的功能和设置,帮助你了解升级影响。 | 检查节点的日志文件以查看弃用警告 |
指标 API(Metrics API) | 提供集群和节点级别的度量信息,如 CPU 使用率、内存使用量等。 | 使用 _nodes/stats 或 _cluster/stats |
示例:
假设我们想要查看集群中所有节点的信息,包括节点的角色和它们的状态:
curl -X GET "localhost:9200/_cat/nodes?v"
在这个示例中,我们使用 _cat/nodes
API 来获取节点的详细信息,?v
参数表示启用详细模式。
接下来,我们可能想要监控集群的健康状况和一些关键的度量信息:
curl -X GET "localhost:9200/_cluster/health?pretty" curl -X GET "localhost:9200/_nodes/stats?pretty"
第一个命令用于检查集群的健康状况,第二个命令用于获取节点的统计信息。
12.Elasticsearch集群管理(Cluster Management)
管理任务 | 描述 | 示例 |
---|---|---|
集群健康(Cluster Health) | 查看集群的状态,包括分片分配和节点信息。 | GET /_cluster/health |
集群设置(Cluster Settings) | 动态更新集群的某些设置而不需要重启。 | PUT /_cluster/settings |
索引管理(Index Management) | 创建、删除索引以及管理索引的映射和设置。 | PUT /my_index , DELETE /my_index |
分片分配(Shard Allocation) | 控制分片在集群中的分配,如将分片移动到特定节点。 | PUT /_cluster/reroute |
节点管理(Node Management) | 添加或移除节点,查看节点状态。 | GET /_cat/nodes |
快照与恢复(Snapshot and Restore) | 备份集群状态和索引数据。 | PUT /_snapshot/my_backup , POST /_snapshot/my_backup/_restore |
集群重启(Cluster Restart) | 重启整个集群或单个节点。 | POST /_cluster/restart |
集群升级(Cluster Upgrade) | 滚动升级 Elasticsearch 集群。 | 逐步升级节点并等待它们重新加入集群 |
示例:
假设我们需要检查集群的当前状态,包括每个索引的分片分配情况:
GET /_cluster/health
这个命令将返回集群的健康状态,包括每个索引的分片数量和状态。
接下来,如果我们想要更新集群的某个动态设置,比如禁用交换索引的分配:
css
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
在这个示例中,我们使用 PUT /_cluster/settings
来更新集群的路由分配设置,将其设置为 "none",这意味着我们禁止了所有新的分片分配。
13.Elasticsearch索引别名(index Alias)
概念 | 描述 | 示例 |
---|---|---|
别名(Alias) | 别名是对一个或多个索引的引用,用于读取(搜索)和写入(索引)操作。 | POST /alias_index/_aliases |
只读别名(Read Alias) | 创建指向索引的只读别名,常用于防止别名被用于写入操作。 | 创建别名时不包含写入权限 |
写入别名(Write Alias) | 创建指向索引的写入别名,用于索引文档。 | POST /write_alias/_bulk |
别名查询(Alias Query) | 使用别名进行查询,可以搜索别名指向的所有索引的数据。 | GET /search_alias/_search |
别名更新(Alias Update) | 更新别名以指向新的索引,而不影响别名的读取和写入操作。 | POST /_aliases |
多索引查询(Multi-Index Query) | 使用别名查询多个索引的数据,别名可以包含多个索引名。 | GET /alias_1,alias_2/_search |
示例:
假设我们有一个日志索引 logstash-2018.01
,我们想要创建一个别名 logs
用于搜索:
css
POST /logstash-2018.01/_aliases
{
"actions": [
{
"add": {
"index": "logstash-2018.01",
"alias": "logs"
}
}
]
}
在这个示例中,我们使用 _aliases
端点给 logstash-2018.01
索引添加了一个别名 logs
。
接下来,如果我们想要搜索所有使用 logs
别名的索引中的数据:
css
GET /logs/_search
{
"query": {
"match_all": {}
}
}
在这个示例中,我们使用别名 logs
来代替具体的索引名进行搜索。
14.Elasticsearch索引末班与模式(Index Templates and Patterns)
概念 | 描述 | 示例 |
---|---|---|
索引模板(Index Template) | 定义新索引的默认设置,如映射、设置和别名。 | PUT /_template/my_template |
模式匹配(Pattern Matching) | 索引模板可以使用模式匹配来自动应用到新创建的索引。 | "index_patterns": ["my-index-*"] |
顺序与优先级(Order and Priority) | 多个索引模板可以存在,Elasticsearch 将根据顺序和优先级选择模板。 | "order": 1, "priority": 100 |
动态映射(Dynamic Mapping) | 控制未知字段的自动映射行为。 | "dynamic": false |
映射定义(Mapping Definitions) | 定义索引中字段的数据类型和属性。 | "mappings": {"properties": {"field1": {"type": "text"}}} |
设置(Settings) | 定义索引级别的设置,如分片数、副本数等。 | "settings": {"number_of_shards": 3} |
示例:
假设我们想要为所有以 my-index-
开头的索引定义一个索引模板,模板中包含一个字段映射和一个设置:
css
PUT /_template/my_template
{
"index_patterns": ["my-index-*"],
"order": 1,
"template": {
"settings": {
"number_of_shards": 3
},
"mappings": {
"properties": {
"field1": {
"type": "text"
}
}
}
}
}
在这个示例中,我们定义了一个名为 my_template
的索引模板,它将自动应用到所有匹配 my-index-*
模式的索引。该模板设置了分片数为3,并定义了一个 field1
文本字段。
15. Elasticsearch搜索操作(Search Operations)
操作类型 | 描述 | 示例 |
---|---|---|
单索引搜索(Single Index Search) | 在单个索引上执行搜索。 | GET /index_name/_search |
多索引搜索(Multi-Index Search) | 同时在多个索引上执行搜索。 | GET /index_1,index_2/_search |
通配符搜索(Wildcard Search) | 使用通配符(* 和 ?)在多个索引上执行搜索。 | GET /index_*/_search |
搜索体(Search Body) | 使用请求体中的 JSON 定义复杂的搜索条件。 | POST /_search with JSON body |
搜索结果大小(Size) | 控制返回的搜索结果数量。 | GET /_search?size=10 |
搜索结果从何开始(From) | 指定搜索结果的偏移量,用于分页。 | GET /_search?size=10&from=10 |
版本类型(Version Type) | 指定文档的版本号,用于处理并发更新。 | GET /_search with version=true |
解析查询(Explain Query) | 提供为什么某个文档匹配搜索条件的详细信息。 | GET /_search?explain=true |
偏好(Preference) | 控制文档的排序或分片,以优化搜索性能。 | GET /_search?preference=_shards:2 |
示例:
假设我们想要在 index_1
和 index_2
上执行搜索,并指定返回结果的大小和从哪个结果开始:
css
GET /index_1,index_2/_search?size=5&from=5
{
"query": {
"match_all": {}
}
}
在这个示例中,我们使用 GET
请求在 index_1
和 index_2
上执行搜索,size
参数设置返回结果的数量为5,from
参数设置从第6个结果开始返回。
接下来,我们可能想要执行一个复杂的搜索,使用搜索体中的 JSON 定义查询:
css
POST /_search
{
"query": {
"bool": {
"must": [
{
"match": {
"field1": "value1"
}
}
],
"filter": [
{
"range": {
"field2": {
"gte": 10
}
}
}
]
}
}
}
在这个示例中,我们使用 POST
请求执行一个布尔查询,它包含一个必须匹配的 match
查询和一个过滤条件 range
查询。
16.Elasticsearch批量操作(Bulk Operations)
操作类型 | 描述 | 示例 |
---|---|---|
批量索引(Bulk Index) | 在单个请求中索引多个文档。 | POST /_bulk with multiple index actions |
批量更新(Bulk Update) | 在单个请求中更新多个文档。 | POST /_bulk with multiple update actions |
批量删除(Bulk Delete) | 在单个请求中删除多个文档。 | POST /_bulk with multiple delete actions |
批量请求体(Bulk Request Body) | 请求体包含多个独立的操作,每个操作都有自己的动作和数据。 | N/A |
刷新控制(Refresh Control) | 控制批量操作后索引的刷新行为。 | POST /_bulk?refresh=true |
示例:
假设我们想要执行一个批量操作,其中包括索引两个文档和一个更新操作:
css
POST /_bulk
{"index": {"_index": "index_name", "_id": "1"}}
{"field1": "value1", "field2": "value2"}
{"update": {"_index": "index_name", "_id": "2"}}
{"doc": {"field3": "value3"}}
{"index": {"_index": "index_name", "_id": "3"}}
{"field4": "value4"}
在这个示例中,我们使用 _bulk
端点来执行批量操作。请求体包含了三个动作:两个索引操作和一个更新操作。
接下来,如果我们想要在执行批量操作后立即使文档可搜索,可以启用刷新:
POST /_bulk?refresh=true
[ ... bulk actions ... ]
在这个示例中,我们在 _bulk
请求的查询字符串中添加了 ?refresh=true
参数,这将导致每个操作后立即触发索引的刷新。
17.Elasticsearch搜索结果解析(Search Result Parsing)
组件 | 描述 | 示例 |
---|---|---|
命中总数(Total Hits) | 搜索结果中匹配的文档总数。 | "hits": {"total": {"value": 10, "relation": "eq"}} |
最高分(Max Score) | 所有匹配文档中最高的相关性分数。 | "max_score": 1.0 |
命中列表(Hits) | 包含单个文档信息的数组。 | "hits": [{"_id": "1", "_source": {"field1": "value1"}}] |
_id(文档ID) | 匹配文档的唯一标识符。 | "_id": "1" |
_source(源文档) | 包含文档内容的 JSON 对象。 | "_source": {"field1": "value1"} |
高亮(Highlight) | 显示搜索词在文档中的高亮部分。 | "highlight": {"content": ["<em>search</em> term found"]} |
解释(Explanation) | 提供文档得分的详细解释。 | "_explanation": "BM25: ..." |
版本(Version) | 匹配文档的版本号。 | "_version": 1 |
示例:
假设我们执行了一个搜索请求,并且想要获取每个匹配文档的详细信息:
css
GET /my_index/_search
{
"query": {
"match_all": {}
}
}
响应可能如下:
css
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "my_index",
"_id": "1",
"_score": 1.0,
"_source": {
"title": "Document Title",
"content": "Document content with the search term."
},
"highlight": {
"content": [
"Document content with the <em>search</em> term."
]
},
"_explanation": "BM25: k1=1.2, b=0.75, docLen=30, avgdl=25, extDocLen=50, IF(idf(t='search'):3)=2.0, IF(df:3, tf:2)=0.39, _score: 2.0/(1.2+1.2×0.75×0.39)×log(30/50)×1.0=1.0"
}
]
}
}
在这个示例中,搜索结果包括了 took
(查询耗时)、timed_out
(是否超时)、_shards
(分片信息)、hits
(命中信息,包括总数、最高分和具体文档列表)等字段。
18.Elasticsearch插件生态系统(Plugins Ecosystem)
插件类型 | 描述 | 示例 |
---|---|---|
监控与可视化(Monitoring & Visualization) | 提供集群监控和数据可视化的工具。 | Elastic Stack's Kibana, ElasticHQ |
安全插件(Security) | 增强安全性,如 SSL/TLS 支持和用户认证。 | X-Pack, Shield |
存储与索引(Storage & Index) | 允许使用不同的存储后端或改变索引行为。 | Azure, HDFS |
传输与集成(Transport & Integration) | 支持与其他服务或数据源的集成。 | Logstash, Beats |
分析与机器学习(Analytics & Machine Learning) | 提供数据分析和机器学习功能。 | Elasticsearch SQL, X-Pack ML |
地理空间(Geospatial) | 增强地理空间数据的处理能力。 | JTS, Geohash |
可扩展性(Scalability) | 帮助集群水平扩展或优化性能。 | Elasticsearch-Hadoop |
示例:
假设我们想要使用 Kibana 对 Elasticsearch 集群进行监控和数据可视化:
bash
# 安装 Kibana
sudo apt-get install kibana
# 启动 Kibana
sudo service kibana start
# 访问 Kibana UI
http://localhost:5601
在这个示例中,我们通过包管理器安装了 Kibana,然后启动服务并访问其 Web 界面。
接下来,如果我们想要增强集群的安全性,可能会安装 X-Pack 插件:
bash
# 安装 X-Pack
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack
# 重启 Elasticsearch 以应用插件更改
sudo service elasticsearch restart
在这个示例中,我们使用 Elasticsearch 的插件安装命令安装了 X-Pack,然后重启 Elasticsearch 服务。
19. Elasticsearch集群状态(Cluster Status)与维护( Cluster Maintenance**)**
操作 | 描述 | 示例 |
---|---|---|
集群健康检查(Cluster Health) | 查看集群的健康状态,包括分片分配和任务进度。 | GET /_cluster/health |
集群统计信息(Cluster Stats) | 获取集群的统计信息,如文档数量、索引数量等。 | GET /_cluster/stats |
节点信息(Node Info) | 查看集群中节点的详细信息,包括节点的角色和状态。 | GET /_nodes |
集群重新路由(Cluster Reroute) | 手动重新路由分片以优化集群或处理故障。 | POST /_cluster/reroute |
集群更新设置(Cluster Update Settings) | 动态更新集群的某些设置。 | PUT /_cluster/settings |
节点重启(Node Restart) | 重启一个或多个 Elasticsearch 节点。 | POST /_cluster/restart |
集群快照(Cluster Snapshot) | 创建集群数据的备份。 | 使用 X-Pack 或第三方插件创建快照 |
集群升级(Cluster Upgrade) | 滚动升级 Elasticsearch 集群到新版本。 | 逐步升级节点 |
示例:
假设我们需要检查集群的当前状态,包括分片分配和任务进度:
GET /_cluster/health
这个命令将返回集群的健康状态,包括每个索引的分片数量和状态。
接下来,如果我们想要获取集群的统计信息,如文档数量和索引数量:
GET /_cluster/stats
这个命令将返回集群的统计信息,包括节点数量、索引数量、文档总数等。
如果您想要手动重新路由分片以优化集群或处理故障:
POST /_cluster/reroute?retry_failed=true
这个命令将尝试重新分配失败的分片。
20. Elasticsearch灾难恢复(Disaster Recovery)与备份(Backup)
功能 | 描述 | 示例 |
---|---|---|
快照与恢复(Snapshot and Restore) | 创建集群状态的备份,并能够恢复数据。 | 使用 X-Pack 插件的 _snapshot API |
索引副本(Index Replicas) | 通过副本分片提高数据的可用性和读取性能。 | 设置 number_of_replicas 在索引设置中 |
硬件故障转移(Hardware Failover) | 当节点发生故障时,副本分片能够自动接管。 | 依赖于副本分片机制 |
集群重启(Cluster Restart) | 安全地重启整个集群或单个节点,用于维护或升级。 | POST /_cluster/restart |
读写一致性(Read/Write Consistency) | 确保即使在节点故障的情况下,数据的读写一致性。 | 使用 write wait 机制 |
时间点恢复(Point-in-Time Recovery, PITR) | 恢复到任意时间点的状态,用于防止数据损坏或误删除。 | 使用快照和时间戳恢复 |
集群重新平衡(Cluster Rebalancing) | 集群自动进行分片的重新平衡,以优化资源使用。 | 自动进行,无需手动干预 |
数据迁移(Data Migration) | 将数据从一个集群迁移到另一个集群或升级集群版本。 | 使用 reindex API |
示例:
假设我们需要创建一个集群的快照,并在需要时恢复数据:
css
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/mount/backups",
"compress": true
}
}
POST /_snapshot/my_backup/snapshot_name?wait=true
在这个示例中,我们首先定义了一个名为 my_backup
的快照存储库,然后创建了一个名为 snapshot_name
的快照。
如果我们需要恢复数据,可以使用以下命令:
POST /_snapshot/my_backup/snapshot_name/_restore
这个命令将开始恢复过程,将数据恢复到集群中。
接下来,如果我们想要在集群中删除旧的快照以节省空间:
DELETE /_snapshot/my_backup/snapshot_name
这个命令将删除指定的快照。
21.Elasticsearch性能优化(Performance Optimization)
优化领域 | 描述 | 示例 |
---|---|---|
查询优化(Query Optimization) | 优化查询结构和查询语句以提高搜索性能。 | 使用过滤器(filter)进行非评分搜索 |
索引优化(Index Optimization) | 优化索引的存储和结构,如使用更少的分片。 | "settings": {"index": {"number_of_shards": 1}} |
分片优化(Shard Optimization) | 调整分片数量以平衡集群的负载和性能。 | 根据数据量和查询负载调整分片数 |
硬件优化(Hardware Optimization) | 根据工作负载选择合适的硬件,如更快的 CPU 或更多的 RAM。 | 固态硬盘(SSD)用于提高 I/O 性能 |
缓存优化(Caching Optimization) | 利用 Elasticsearch 的缓存机制,如字段数据缓存。 | 调整 indices.fielddata.cache 相关设置 |
批量处理(Bulk Processing) | 使用批量操作减少网络开销和提高索引效率。 | 使用 _bulk API 进行文档索引 |
刷新和合并(Refresh and Merge) | 调整索引的刷新间隔和合并策略以优化写入性能。 | 设置 "refresh_interval": "30s" |
线程池管理(Thread Pool Management) | 根据操作类型调整线程池大小。 | 为搜索和索引操作设置不同的线程池 |
搜索结果缓存(Search Result Caching) | 缓存常见的搜索结果以加快读取速度。 | 使用 cache 参数在搜索时缓存结果 |
冷热架构(Hot-Warm Architecture) | 在热节点上执行写入和实时搜索,在冷节点上执行历史数据分析。 | 使用冷热节点架构优化成本和性能 |
示例:
假设我们想要优化查询性能,特别是当查询非常频繁且数据集很大时:
css
GET /_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"category.keyword": "books"
}
}
],
"must": [
{
"match": {
"description": "Elasticsearch"
}
}
]
}
}
}
在这个示例中,我们使用 bool
查询的 filter
子句对 category
字段进行精确匹配,这样会使用 term
查询而不是全文 match
查询,因为它不需要计算相关性得分,可以提高性能。
接下来,如果我们想要优化索引的存储,减少分片数量以提高查询速度:
css
PUT /my_index
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
}
在这个示例中,我们创建了一个名为 my_index
的新索引,并将分片数设置为1,副本数设置为1,这适用于数据量不大且查询性能要求较高的场景。
暂时就先总结这些吧,后续再继续细化。