一、简介
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都能以支持快速搜索的方式高效地存储和索引它。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
Elasticsearch位于Elastic Stack的核心,它能够对大量数据进行搜索、分析和探索。Elasticsearch的分布式特性使您的部署能够随着数据和查询量的增长而无缝增长。
Elasticsearch的特点包括:
- 为用户提供按关键字查询的全文搜索功能。
- 实现企业海量数据的处理分析的解决方案,是大数据领域的重要一份子,如著名的ELK框架(Elasticsearch、Logstash、Kibana)。
- 把数据分成多个shard,多个shard可以组成一份完整的数据,这些shard可以分布在集群中的各个机器节点中。随着数据的不断增加,集群可以增加多个分片,把多个分片放到多个机子上,以达到负载均衡,横向扩展。
- 所有数据都是默认进行索引的,这点和MySQL正好相反,MySQL是默认不加索引,要加索引必须特别说明,而Elasticsearch只有不加索引才需要说明。
- 使用的是倒排索引,和MySQL的B+Tree索引不同。
目前市面上流行的搜索引擎软件,主流的就两款,elasticsearch和solr。这两款都是基于lucene搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作,修改、添加、保存、查询等等都十分类似。从实际企业使用情况来看,elasticSearch的市场份额逐步在取代solr,国内百度、京东、新浪都是基于elasticSearch实现的搜索功能。国外就更多了,像维基百科、GitHub、Stack Overflow等等也都是基于ES的。
二、核心概念
1. Cluster(集群):
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
2. Node(节点):
集群中的一个实例。
3. Shard(分片):
索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
4. Replica(副本):
在主分片的基础上,创建的分片的副本。
5. Index(索引):
Elasticsearch将数据存储于一个或多个索引中,索引是具有类似属性的文档的集合。
6. Type(类型):
索引可以定义为多个类型,是索引的一个逻辑分区,每个类型都有自己的映射或模式定义,用于确定该类型下的文档可以有哪些字段,以及字段的数据类型。不过,从Elasticsearch 6.x版本开始,已经废弃多Type的索引概念,Elasticsearch 7.x版本中已经彻底移除Type。
7. Document(文档):
索引中的一条数据,它是一个JSON格式的字符串,可以把它理解为数据库中的一行记录。
8. Field(字段):
Document中的属性,比如一个Document里面包含了title、content、timestamp等Field。
三、安装部署
Elasticsearch的安装部署步骤大致如下:
1. 下载安装包
Elasticsearch和Kibana的下载地址为:https://www.elastic.co/cn/downloads/past-releases
注意:es和kibana版本下载需一致,目前生产环境大多采用大版本6.x.x;7.x.x版本相对较新,但部署流程都一样。
2. 机器规划
例如规划3台机器:
- 11.8.37.50 ops01
- 11.8.36.63 ops02
- 11.8.36.76 ops03
如果在各节点的/etc/hosts中都配置了节点的ip解析,那后续在配置文件中,相关的ip配置都可以用解析名代替。例如:network.host: 11.8.37.50 等同于 network.host: ops01。
3. 下载安装包
下载完成后,可以使用以下命令查看安装包:
wangting@ops01:/opt/software>ll|grep6.6.0
-rw-r--r-- 1wangting wangting114106988Aug414:40 elasticsearch-6.6.0.tar.gz
-rw-r--r-- 1wangting wangting180704352Aug414:40 kibana-6.6.0-linux-x86_64.tar.gz
4. 环境优化
-
优化1:系统允许Elasticsearch打开的最大文件数需要修改成65536。
wangting@ops01:/opt/software>sudo vim /etc/security/limits.conf # End of file * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 65536 # 断开重连会话 wangting@ops01:/home/wangting>ulimit -n65536
如果不优化这个配置,启动服务时会出现以下错误:
[error] max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536] elasticsearch
-
优化2:允许最大进程数配置修改成4096,如果不是4096则需要修改优化。
wangting@ops01:/home/wangting>sudo vim /etc/security/limits.d/20-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc 4096 root soft nproc unlimited
如果不优化这个配置,启动服务时会出现以下错误:
[error] max number of threads [1024] for user [judy2] likely too low, increase to at least [4096]
-
优化3:设置一个进程可以拥有的虚拟内存区域的数量。
wangting@ops01:/home/wangting>sudo vim /etc/sysctl.conf vm.max_map_count=262144 # 重载配置 wangting@ops01:/home/wangting>sudo sysctl -p
如果不优化这个配置,启动服务时会出现以下错误:
[error] max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
四、Elasticsearch使用示例
示例一:全文搜索与高亮显示
业务场景:某电商平台需要为用户提供高效的商品搜索功能,要求在海量数据中快速返回匹配结果,并高亮显示关键字,提升用户体验。
索引设计:对商品名称、描述、品牌等字段进行全文索引,使用Elasticsearch的分词器(如Standard Analyzer)处理数据,确保用户输入的关键字可以正确匹配商品信息。
搜索功能:使用match查询类型,配合multi_match进行多个字段的搜索,确保用户查询能匹配到商品名称、描述等相关字段。
高亮显示:使用highlight功能,在返回的结果中对匹配的关键字进行高亮处理,提升用户可读性。
详细分析:Elasticsearch提供了强大的倒排索引机制,使得全文搜索非常高效。通过灵活的查询组合,用户可以精确匹配多种字段的搜索条件,同时高亮功能可以让用户直观地看到匹配位置。
要实现全文搜索与高亮显示的功能,主要分为以下几个步骤,包括Elasticsearch环境的设置、数据的索引、查询的编写,以及高亮显示的处理。
-
确保Elasticsearch已经安装并运行
如果尚未安装,可以通过Docker快速启动一个Elasticsearch实例:
docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8 .x
-
创建索引和映射
在Elasticsearch中,我们需要为商品数据创建一个索引,并定义其字段的映射。假设我们的商品数据包含以下字段:
product_id
(产品ID)、name
(产品名称)、description
(产品描述)、brand
(品牌)。PUT /products {"mappings": {"properties": {"product_id": { "type": "keyword" },"name": { "type": "text", "analyzer": "standard" },"description": { "type": "text", "analyzer": "standard" },"brand": { "type": "text", "analyzer": "standard" }}} }
-
导入数据
接下来,我们需要将商品数据导入Elasticsearch。这通常通过批量索引API(Bulk API)完成,以提高效率。
POST /products/_bulk { "index": {} } { "product_id": "1", "name": "Apple iPhone 13", "description": "Latest Apple smartphone with A15 Bionic chip.", "brand": "Apple" } { "index": {} } { "product_id": "2", "name": "Samsung Galaxy S21", "description": "High-end Samsung smartphone with Snapdragon 888 processor.", "brand": "Samsung" } # 可以继续添加更多商品数据
-
执行搜索查询
现在,我们可以执行搜索查询,以查找与特定关键字匹配的商品。在这个例子中,我们想要找到包含“smartphone”的商品,并高亮显示匹配的关键字。
GET /products/_search {"query": {"multi_match": {"query": "smartphone","fields": ["name", "description"]}},"highlight": {"fields": {"name": {},"description": {}}} }
这个查询将返回所有包含“smartphone”关键字的商品,并在返回的JSON结果中,
highlight
字段将包含高亮显示的匹配内容。 -
处理搜索结果
最后,我们需要处理Elasticsearch返回的搜索结果,将其展示给用户。这通常涉及解析JSON响应,提取所需的字段(如产品ID、名称、描述和高亮显示的文本),并将它们以用户友好的方式呈现。
示例JSON响应(简化):
{"hits": {"hits": [{"_source": {"product_id": "1","name": "Apple iPhone 13","description": "Latest Apple smartphone with A15 Bionic chip.","brand": "Apple"},"highlight": {"name": [],"description": ["<em>smartphone</em> with A15 Bionic chip."]}},{"_source": {"product_id": "2","name": "Samsung Galaxy S21","description": "High-end Samsung <em>smartphone</em> with Snapdragon 888 processor.","brand": "Samsung"},"highlight": {"name": [],"description": ["High-end Samsung <em>smartphone</em> with Snapdragon 888 processor."]}}]} }
在上面的响应中,
highlight
字段显示了高亮显示的匹配内容。在前端,我们可以使用这些高亮显示的文本来增强用户体验,例如,通过将匹配的关键字加粗或以不同颜色显示。
示例二:实时日志分析
业务场景:某互联网公司需要对其服务器生成的日志进行实时分析,以监控系统的健康状况,及时发现并解决潜在问题。
索引设计:对日志数据进行索引,包括日志级别(如INFO、ERROR)、时间戳、日志消息等字段。使用Elasticsearch的时间序列分析功能,按时间顺序存储和查询日志数据。
实时分析:利用Elasticsearch的实时查询能力,对日志数据进行过滤和聚合分析,以监控系统的关键指标(如错误率、响应时间等)。
报警机制:结合Kibana或其他监控工具,设置报警规则,当系统出现异常(如错误日志数量激增)时,及时通知相关人员进行处理。
详细分析:Elasticsearch的索引设计和实时分析能力使其成为日志分析的理想工具。通过合理的索引设计,可以高效地存储和查询日志数据。实时查询和聚合分析功能使得系统管理员能够实时监控系统状态,及时发现潜在问题。结合Kibana等可视化工具,可以方便地设置报警规则,实现自动化监控和报警。
由于篇幅限制,实时日志分析的具体实现步骤在此不再赘述,但大致流程包括:
-
配置Logstash或Filebeat等日志收集工具,将服务器生成的日志数据发送到Elasticsearch。
-
在Elasticsearch中创建索引,并定义日志数据的映射。
-
使用Kibana或其他可视化工具,创建仪表盘(Dashboard)和报警规则,对日志数据进行实时监控和分析。
-
根据分析结果,采取相应的措施,如优化系统性能、修复错误等。
以上两个示例展示了Elasticsearch在全文搜索和日志分析方面的应用。通过合理的索引设计和查询优化,Elasticsearch可以高效地处理海量数据,满足各种业务需求。同时,结合Kibana等可视化工具,可以方便地实现数据监控和报警功能,提高系统的稳定性和可靠性。
总结
Elasticsearch是一个功能强大的开源搜索引擎,基于Lucene构建,提供分布式、多用户的全文搜索功能。它支持RESTful web接口,以Java开发,并能高效地存储、索引和搜索结构化、非结构化及地理空间数据。Elasticsearch与Logstash和Kibana共同构成了Elastic Stack(ELK Stack),为用户提供数据收集、搜索、分析和可视化的完整解决方案。