Elasticsearch教程
  II8xaEOHQ5SU 2023年12月05日 24 0

Elasticsearch 简介

Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,由 Elasticsearch B.V. 公司开发和维护,采用 Apache 2.0 开源协议。它可以帮助用户快速地存储、搜索和分析大规模的数据,并提供高效的文本检索、聚合和可视化功能。Elasticsearch 支持多种查询语法,包括全文搜索、精确匹配、通配符、范围、正则表达式等,同时还支持多种数据类型,包括数字、日期、地理位置等。Elasticsearch 通过自动将数据分片并存储在不同节点上,实现了高可用性和水平扩展。

数据存储和索引

Elasticsearch 采用倒排索引(Inverted Index)来存储和索引数据,它将每个文档中的所有词条都存储到一个排序后的列表中,并建立从词条到文档的映射关系。这样,用户在搜索时只需要查找相应的词条即可找到相关的文档。为了保证搜索性能和稳定性,Elasticsearch 将数据划分成多个分片和副本,并将其分配到不同的节点上。分片可以水平扩展,而副本可以提高搜索性能和可用性。

在 Elasticsearch 中,文档是最小的单位,每个文档都必须有唯一的 ID 和一个包含了所有数据的 JSON 文档体。Elasticsearch 还支持映射(mapping),将文档中的字段和对应数据类型进行定义。这样,用户可以针对不同的字段进行排序、聚合、分析等操作。

查询和搜索

Elasticsearch 支持多种查询语法和搜索功能,包括全文搜索、精确匹配、聚合、过滤等。其中,全文搜索是最常用的查询方式,它会对用户输入的关键词进行分词,并根据相关性进行排序。全文搜索还支持模糊搜索、通配符、正则表达式等查询方式,以便更好地满足用户的需求。

Elasticsearch 还支持聚合和过滤操作,这使得用户可以在搜索结果中进行数据统计、分组、排序等操作,从而更好地理解数据。例如,用户可以根据时间范围、地理位置、价格区间等条件来筛选搜索结果,或者通过条形图、饼图、地图等可视化方式来展示数据。

分布式架构和高可用性

Elasticsearch 的分布式架构和高可用性是其最重要的特点之一。Elasticsearch 可以在集群中运行多个节点,数据会被自动分片并存储在不同的节点上,以实现高可用性和水平扩展。Elasticsearch 还通过自动发现和节点恢复等机制,保证了系统在节点故障或网络分区时的可用性。

为了提高搜索性能和可靠性,Elasticsearch 引入了副本(Replicas)的概念。副本是对每个分片的一份完整拷贝,可以存放在不同的节点上。当主分片(Primary Shard)出现故障或不可用时,副本分片会立即接管其工作,并继续服务。这种方式可以大大减少系统停机时间和数据损失。

性能调优和优化

要想获得更好的 Elasticsearch 性能和效率,需要进行一些性能调优和优化。以下是 Elasticsearch 性能优化的一些技巧:

  • 确定正确的数据分片数量:数据分片数量对于 Elasticsearch 的性能非常重要,过多或过少都会影响搜索、聚合和写入速度。通常建议将每个节点上的分片数限制在 20~30 个之间。
  • 使用合适的硬件配置:Elasticsearch 需要大量的 CPU、内存和磁盘空间来处理数据和搜索请求。因此,在部署 Elasticsearch 时,需要根据数据大小和用户量等因素,选择合适的硬件配置,以获得更好的性能和扩展性。
  • 合理使用缓存:Elasticsearch 提供了多种缓存机制,例如查询缓存、字段数据缓存、近实时(NRT)缓存等。合理地使用这些缓存可以大大提高搜索性能和效率。
  • 批量操作和线程池:Elasticsearch 支持批量操作和线程池,可以在减少网络开销和提高并发处理能力方面发挥重要作用。尤其是在索引大量文档时,批量操作可以大大减少索引时间和资源消耗。
  • 注意数据的存储和检索方式:Elasticsearch 中的数据存储和检索方式对性能也有很大影响。例如,使用 keyword 类型可以提高精确匹配的速度,但对于全文搜索则不适用;使用倒排索引可以加快关键词搜索,但会增加写入时间和磁盘空间等成本。
  • 使用插件并进行定期维护:Elasticsearch 的插件生态非常丰富,用户可以通过安装各种插件来扩展 Elasticsearch 的功能和性能。同时,需要定期维护 Elasticsearch 系统,例如清理无用数据、优化分片布局、监控集群健康状态等等。

总之,要想获得更好的 Elasticsearch 性能和效率,需要实现正确的数据分片、合适的硬件配置、缓存机制、批量操作、注意数据存储方式和使用插件等一系列调优和优化技巧。

ELK 栈和日志分析

ELK 栈是由 Elasticsearch、Logstash 和 Kibana 组成的一个开源平台,主要用于日志分析、监控和可视化。其中 Elasticsearch 作为数据存储和搜索引擎,Logstash 负责数据采集和过滤处理,而 Kibana 则提供了强大的可视化和仪表盘功能。

在 ELK 栈中,Logstash 可以从多种数据源(如文件、数据库、网络流等)中收集数据,并将其转换成标准格式。然后,Logstash 将数据传递给 Elasticsearch 进行存储和索引,以便用户进行搜索和分析。最后,Kibana 可以通过可视化方式来展示搜索结果、统计数据、生成仪表盘等。

日志分析是 ELK 栈的主要应用之一,可以帮助用户监控系统健康状况、分析异常行为和优化性能。例如,用户可以通过 ELK 栈来收集 Web 服务器日志,并对其进行统计分析,以了解访问量、IP 地址、浏览器类型等信息,或者根据关键词、时间范围等条件来过滤出有用的信息。

实时搜索和推荐系统

实时搜索和推荐系统是 Elasticsearch 的另一个重要应用领域。实时搜索可以在用户输入关键词时及时返回相应的搜索结果,而推荐系统则可以根据用户历史行为、兴趣偏好等信息来推荐相关内容。

要实现实时搜索和推荐系统,需要注意以下几点:

  • 数据同步和更新:在实时搜索和推荐系统中,数据的同步和更新非常重要。因此,需要采用一些方式来保证数据的及时性和完整性。例如,可以使用 Elasticsearch 的实时搜索(Real-time Search)功能,使得新增、修改和删除的文档可以立即生效。
  • 查询和排序性能:实时搜索和推荐系统需要快速响应用户查询请求,因此查询和排序性能是非常关键的。可以通过合理使用缓存、优化分片布局、选择合适的数据结构等方式来提高性能。
  • 用户行为分析和算法应用:推荐系统需要根据用户历史行为、兴趣偏好等信息来进行推荐。可以采用 Elasticsearch 的聚合功能来对用户行为数据进行统计分析,并通过机器学习算法如协同过滤、矩阵分解等来进行推荐。
  • 可视化和监控:可以通过 Elasticsearch 提供的可视化工具和监控功能,来查看搜索和推荐系统的运行状态和表现,并进行调整和优化。

总之,Elasticsearch 提供了强大的实时搜索和推荐系统支持,可以帮助用户快速地构建高质量的搜索和推荐平台。需要注意数据同步与更新、查询和排序性能、用户行为分析和算法应用以及可视化和监控等方面,来实现更好的性能和效果。

大数据和机器学习

Elasticsearch 可以与大数据和机器学习结合来进行数据挖掘、预测和模型训练等操作。例如,可以将 Elasticsearch 作为 Spark、Hadoop 等大数据处理平台的数据源,进行分布式计算和分析。同时,可以采用 Elasticsearch 的聚合和过滤功能来进行数据统计和分析,从而发现数据中的规律和趋势。

另外,Elasticsearch 还支持多种机器学习算法的应用,例如分类、聚类、回归等。通过使用这些算法,可以对大数据进行深入挖掘和分析,提取出其中的有用信息和模式,并应用于实际业务场景中。

总之,将 Elasticsearch 与大数据和机器学习相结合,可以帮助用户更好地理解数据、发现规律和趋势,并应用于实际业务场景中,实现更好的商业价值和竞争优势。

数据格式

Elasticsearch教程_Elastic

ES里的Index可以看做一个库,而 Types 相当于表,Documents则相当于表的行。

这里Types 的概念已经被逐渐弱化,Elasticsearch 6.X中,一个index下已经只能包含一个type,Elasticsearch 7.X中, Type的概念已经被删除了。

倒排索引和正排(正向)索引

正向索引

id

content

1001

my name is zhang san

1002

my name is li si

将id设为主键,根据id查询速度很快,但是如果需要查询content中的内容,需要模糊查询,速度很慢

倒排索引

keyword

id

name

1001,1002

zhang

1001

si

1002

根据拆分关键字查出id

索引操作

1. 创建索引

对比关系型数据库,创建索引就等同于创建数据库

PUT shopping

响应结果:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "shopping"
}

PUT请求具有幂等性,创建成功后再次创建会报错:

{
  "error": {
    "root_cause": [
      {
        "type": "resource_already_exists_exception",
        "reason": "index [shopping/7nJJqBXlSU6ITN_hRfWSIg] already exists",
        "index_uuid": "7nJJqBXlSU6ITN_hRfWSIg",
        "index": "shopping"
      }
    ],
    "type": "resource_already_exists_exception",
    "reason": "index [shopping/7nJJqBXlSU6ITN_hRfWSIg] already exists",
    "index_uuid": "7nJJqBXlSU6ITN_hRfWSIg",
    "index": "shopping"
  },
  "status": 400
}

2. 查看索引

  • 查看指定索引信息

GET shopping

响应结果:

{
  "shopping" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1686275892423",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "7nJJqBXlSU6ITN_hRfWSIg",
        "version" : {
          "created" : "7040299"
        },
        "provided_name" : "shopping"
      }
    }
  }
}
  • 查看全部索引信息

GET _cat/indices?v

响应结果:

health status index                    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   shopping                 7nJJqBXlSU6ITN_hRfWSIg   1   1          0            0       283b           283b

3. 删除索引

DELETE shopping

相应结果:

{
  "acknowledged" : true
}

数据操作

1. 添加数据

  • 自动生成id

POST shopping/_doc { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999.00 }

响应结果:

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "7v0CnogBPg6xqL0VNK6S",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
  • 自定义id

POST shopping/_doc/1001 { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 3999.00 }

相应结果:

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "1001",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

2. 查询数据

  • 主键查询数据

GET shopping/_doc/1001

响应结果:

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "1001",
  "_version" : 1,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "title" : "小米手机",
    "category" : "小米",
    "images" : "http://www.gulixueyuan.com/xm.jpg",
    "price" : 3999.0
  }
}
  • 查询全部数据

GET shopping/_search

响应结果:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      },
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      }
    ]
  }
}

3. 修改数据

  • 全量数据替换

PUT shopping/_doc/1001 { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jpg", "price": 4999.00 }

响应结果:

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "1001",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

POST shopping/_update/1001 { "doc": { "title": "华为手机" } }

响应结果:

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "1001",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}

4. 删除数据

DELETE shopping/_doc/1001

响应结果:

{
  "_index" : "shopping",
  "_type" : "_doc",
  "_id" : "1001",
  "_version" : 8,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 8,
  "_primary_term" : 1
}

复杂条件查询

条件查询

GET shopping/_search?q=category:小米

或者

GET shopping/_search { "query": { "match": { "category": "小米" } } }

响应结果:

{
  "took" : 494,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.14821595,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 0.14821595,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      },
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 0.14821595,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      }
    ]
  }
}

全量查询

GET shopping/_search { "query": { "match_all": { } } }

相应结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      },
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      }
    ]
  }
}

分页查询

GET shopping/_search { "query": { "match_all": { } }, "from": 0, "size": 1 }

相应结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      }
    ]
  }
}

查询指定字段

GET shopping/_search { "query": { "match_all": { } }, "from": 0, "size": 1, "_source": ["title"] }

相应结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机"
        }
      }
    ]
  }
}

查询结果排序

GET shopping/_search { "query": { "match_all": { } }, "from": 0, "size": 2, "_source": ["title"], "sort": [ { "price": { "order": "desc" } } ] }

相应结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : null,
        "_source" : {
          "title" : "华为手机"
        },
        "sort" : [
          4999.0
        ]
      },
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : null,
        "_source" : {
          "title" : "小米手机"
        },
        "sort" : [
          3999.0
        ]
      }
    ]
  }
}

多条件查询

GET shopping/_search { "query": { "bool": { "must": [ { "match": { "category": "小米" } } ], "filter": { "range": { "price": { "gt": 4000 } } } } } }

说明:

多条件查询需要使用bool,“must”“should”分别对应“and”“or”

filter表示范围查询

查询时分词匹配和完全匹配

GET shopping/_search { "query": { "match": { "category": "小华" } } }

此时查询时为分词匹配,即查询结果中category中包含“小”“华”的文档都可以查询出来

GET shopping/_search { "query": { "match_phrase": { "category": "小华" } } }

将match替换为match_phrase及为完全匹配查询,只有category包含“小华”的结果能被查询出来

查询结果高量显示

GET shopping/_search { "query": { "match_phrase": { "category": "小" } }, "highlight": { "fields": { "category": {} } } }

相应结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.18232156,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 0.18232156,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        },
        "highlight" : {
          "category" : [
            "<em>小</em>米"
          ]
        }
      },
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 0.18232156,
        "_source" : {
          "title" : "华为手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 4999.0
        },
        "highlight" : {
          "category" : [
            "<em>小</em>米"
          ]
        }
      }
    ]
  }
}

聚合查询

1. 分组

GET shopping/_search { "aggs": { //聚合操作 "price_group": { //名称,随意起的 "terms": { //分组 "field": "price" //分组字段 } } } }

相应结果:

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "7v0CnogBPg6xqL0VNK6S",
        "_score" : 1.0,
        "_source" : {
          "title" : "小米手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 3999.0
        }
      },
      {
        "_index" : "shopping",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 1.0,
        "_source" : {
          "title" : "华为手机",
          "category" : "小米",
          "images" : "http://www.gulixueyuan.com/xm.jpg",
          "price" : 4999.0
        }
      }
    ]
  },
  "aggregations" : {
    "price_group" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 3999.0,
          "doc_count" : 1
        },
        {
          "key" : 4999.0,
          "doc_count" : 1
        }
      ]
    }
  }
}
2. 平均值

GET shopping/_search { "aggs": { //聚合操作 "price_avg": { //名称,随意起的 "avg": { //平均值 "field": "price" //分组字段 } } }, "size": 0 }

相应结果:

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "price_avg" : {
      "value" : 4499.0
    }
  }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
II8xaEOHQ5SU
作者其他文章 更多

2023-12-05