欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 中间件之Elasticsearch

中间件之Elasticsearch

2024/12/4 23:56:44 来源:https://blog.csdn.net/qq_40921573/article/details/144161289  浏览:    关键词:中间件之Elasticsearch

一、简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都能以支持快速搜索的方式高效地存储和索引它。

Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。

Elasticsearch位于Elastic Stack的核心,它能够对大量数据进行搜索、分析和探索。Elasticsearch的分布式特性使您的部署能够随着数据和查询量的增长而无缝增长。

Elasticsearch的特点包括:

  1. 为用户提供按关键字查询的全文搜索功能。
  2. 实现企业海量数据的处理分析的解决方案,是大数据领域的重要一份子,如著名的ELK框架(Elasticsearch、Logstash、Kibana)。
  3. 把数据分成多个shard,多个shard可以组成一份完整的数据,这些shard可以分布在集群中的各个机器节点中。随着数据的不断增加,集群可以增加多个分片,把多个分片放到多个机子上,以达到负载均衡,横向扩展。
  4. 所有数据都是默认进行索引的,这点和MySQL正好相反,MySQL是默认不加索引,要加索引必须特别说明,而Elasticsearch只有不加索引才需要说明。
  5. 使用的是倒排索引,和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环境的设置、数据的索引、查询的编写,以及高亮显示的处理。

  1. 确保Elasticsearch已经安装并运行

    如果尚未安装,可以通过Docker快速启动一个Elasticsearch实例:

    docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8
    .x
    
  2. 创建索引和映射

    在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" }}}
    }
    
  3. 导入数据

    接下来,我们需要将商品数据导入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" }
    # 可以继续添加更多商品数据
    
  4. 执行搜索查询

    现在,我们可以执行搜索查询,以查找与特定关键字匹配的商品。在这个例子中,我们想要找到包含“smartphone”的商品,并高亮显示匹配的关键字。

    GET /products/_search
    {"query": {"multi_match": {"query": "smartphone","fields": ["name", "description"]}},"highlight": {"fields": {"name": {},"description": {}}}
    }
    

    这个查询将返回所有包含“smartphone”关键字的商品,并在返回的JSON结果中,highlight字段将包含高亮显示的匹配内容。

  5. 处理搜索结果

    最后,我们需要处理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等可视化工具,可以方便地设置报警规则,实现自动化监控和报警。

由于篇幅限制,实时日志分析的具体实现步骤在此不再赘述,但大致流程包括:

  1. 配置Logstash或Filebeat等日志收集工具,将服务器生成的日志数据发送到Elasticsearch。

  2. 在Elasticsearch中创建索引,并定义日志数据的映射。

  3. 使用Kibana或其他可视化工具,创建仪表盘(Dashboard)和报警规则,对日志数据进行实时监控和分析。

  4. 根据分析结果,采取相应的措施,如优化系统性能、修复错误等。

以上两个示例展示了Elasticsearch在全文搜索和日志分析方面的应用。通过合理的索引设计和查询优化,Elasticsearch可以高效地处理海量数据,满足各种业务需求。同时,结合Kibana等可视化工具,可以方便地实现数据监控和报警功能,提高系统的稳定性和可靠性。

总结

Elasticsearch是一个功能强大的开源搜索引擎,基于Lucene构建,提供分布式、多用户的全文搜索功能。它支持RESTful web接口,以Java开发,并能高效地存储、索引和搜索结构化、非结构化及地理空间数据。Elasticsearch与Logstash和Kibana共同构成了Elastic Stack(ELK Stack),为用户提供数据收集、搜索、分析和可视化的完整解决方案。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com