当前位置: 首页 > article >正文

中间件之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),为用户提供数据收集、搜索、分析和可视化的完整解决方案。


http://www.kler.cn/a/421982.html

相关文章:

  • opencv常用图像处理操作
  • Rust循环引用与多线程并发
  • 《Python基础》之Pandas库
  • QT6学习第八天 QFrame 类
  • Linux中的 tail 命令
  • 在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)
  • 各种类型无人机性能及优缺点技术详解
  • 【乐企文件生成工程】搭建docker环境,使用docker部署工程
  • 【CSS in Depth 2 精译_800】附录A:CSS 选择器的含义及部分用法示例
  • 一次奇妙的getshell之旅
  • 数据结构--二叉树的创建和遍历
  • 28.100ASK_T113-PRO Linux+QT 显示一张照片
  • 6.824/6.5840 Lab 1: MapReduce
  • 第N9周:seq2seq翻译实战-Pytorch复现-小白版
  • 量化交易系统开发-实时行情自动化交易-8.5.VNPY平台
  • 利用Docker一键发布Nginx-Tomcat-MySQL应用集群
  • 【方案三】JAVA中使用ocr(Umi-OCR)
  • 嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压
  • 剖析设备像素、CSS 像素等的特性与用途
  • 关于layui的dropdown下拉框缓存问题修复
  • 【星海随笔】syslinux
  • 面试题-RocketMQ的基本架构、支持的消息模式、如何保证消息的可靠传输
  • Elasticsearch做分词实践
  • Day 30 贪心算法 part04
  • Linux安装部署Redis教程
  • Linux基础—防火墙2