中间件之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. 下载安装包

下载完成后,可以使用以下命令查看安装包:

bash 复制代码
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。

    bash 复制代码
    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

    如果不优化这个配置,启动服务时会出现以下错误:

    bash 复制代码
    [error] max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536] elasticsearch
  • 优化2:允许最大进程数配置修改成4096,如果不是4096则需要修改优化。

    bash 复制代码
    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

    如果不优化这个配置,启动服务时会出现以下错误:

    bash 复制代码
    [error] max number of threads [1024] for user [judy2] likely too low, increase to at least [4096]
  • 优化3:设置一个进程可以拥有的虚拟内存区域的数量。

    bash 复制代码
    wangting@ops01:/home/wangting>sudo vim /etc/sysctl.conf
    vm.max_map_count=262144
    # 重载配置
    wangting@ops01:/home/wangting>sudo sysctl -p

    如果不优化这个配置,启动服务时会出现以下错误:

    bash 复制代码
    [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实例:

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

    在Elasticsearch中,我们需要为商品数据创建一个索引,并定义其字段的映射。假设我们的商品数据包含以下字段:product_id(产品ID)、name(产品名称)、description(产品描述)、brand(品牌)。

    bash 复制代码
    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)完成,以提高效率。

    bash 复制代码
    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"的商品,并高亮显示匹配的关键字。

    bash 复制代码
    GET /products/_search
    {
      "query": {
        "multi_match": {
          "query": "smartphone",
          "fields": ["name", "description"]
        }
      },
      "highlight": {
        "fields": {
          "name": {},
          "description": {}
        }
      }
    }

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

  5. 处理搜索结果

    最后,我们需要处理Elasticsearch返回的搜索结果,将其展示给用户。这通常涉及解析JSON响应,提取所需的字段(如产品ID、名称、描述和高亮显示的文本),并将它们以用户友好的方式呈现。

    示例JSON响应(简化):

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

相关推荐
Dusk_橙子6 小时前
在elasticsearch中,document数据的写入流程如何?
大数据·elasticsearch·搜索引擎
喝醉酒的小白8 小时前
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
大数据·elasticsearch·jenkins
熟透的蜗牛10 小时前
Elasticsearch 8.17.1 JAVA工具类
elasticsearch
九圣残炎14 小时前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
risc12345616 小时前
【Elasticsearch】HNSW
elasticsearch
我的棉裤丢了17 小时前
windows安装ES
大数据·elasticsearch·搜索引擎
乙卯年QAQ19 小时前
【Elasticsearch】RestClient操作文档
java·大数据·elasticsearch·jenkins
超级阿飞1 天前
利用Kubespray安装生产环境的k8s集群-实施篇
elasticsearch·容器·kubernetes
小诺大人1 天前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
forestsea2 天前
【Elasticsearch 】 聚合分析:桶聚合
大数据·elasticsearch·搜索引擎