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 与大数据和机器学习相结合,可以帮助用户更好地理解数据、发现规律和趋势,并应用于实际业务场景中,实现更好的商业价值和竞争优势。
数据格式
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
}
}
}