中间件之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.mzph.cn/pingmian/62924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见排序算法总结 (三) - 归并排序与归并分治

归并排序 算法思想 将数组元素不断地拆分&#xff0c;直到每一组中只包含一个元素&#xff0c;单个元素天然有序。之后用归并的方式收集跨组的元素&#xff0c;最终形成整个区间上有序的序列。 稳定性分析 归并排序是稳定的&#xff0c;拆分数组时会自然地将元素分成有先后…

http(请求方法,状态码,Cookie与)

目录 1.http中常见的Header(KV结构) 2.http请求方法 2.1 请求方法 2.2 telnet 2.3 网页根目录 2.3.1 概念 2.3.2 构建一个首页 2.4 GET与POST方法 2.4.1 提交参数 2.4.2 GET与POST提交参数对比 2.4.3 GET和POST对比 3.状态码 3.1 状态码分类 3.2 3XXX状态码 3.2 …

365天深度学习训练营-第P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文为「365天深度学习训练营」内部文章 参考本文所写记录性文章&#xff0c;请在文章开头带上「&#x1f449;声明」 &#x1f37a;要求&#xff1a; 保存训练过…

Laravel 代理收益排行榜

创建了一个收入表 CREATE TABLE income_logs (id int(11) unsigned NOT NULL AUTO_INCREMENT,order_id int(11) NOT NULL COMMENT 订单ID,type int(11) NOT NULL DEFAULT 0 COMMENT 类型 0 支出 1收入,user_id int(11) NOT NULL COMMENT 消费者用户,price decimal(10,2) NOT…

【Linux】设计文件系统(C实现)

要求&#xff1a; (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限&#xff08;八进制&#xff09;、文件长度、时间&#xff08;创建时间&#xff0c;修改时间以及…

开源用户体验调查管理平台Formbricks

什么是 Formbricks &#xff1f; Formbricks 是一个开源的调查和体验管理平台&#xff0c;旨在帮助用户在应用内、网站、链接和电子邮件中收集用户和客户的反馈。它为开发者提供了一个隐私优先的替代方案&#xff0c;支持自托管或使用 Formbricks 云服务&#xff0c;并提供了丰…

0.Git初步概念

1.Git应用场景 场景一&#xff1a;资料备份 场景二&#xff1a;代码还原(回滚) 场景三&#xff1a;协同开发 场景四&#xff1a;追溯问题代码的开发人和开发时间 解决方式&#xff1a;版本控制 2.版本控制方式 a、集中式版本控制工具 用户将代码集中存储到中央服务器&#x…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…

centos6.1 安装 conan环境

自带python版本过低&#xff0c;无法安装conan 安装编译工具 yum install -y gcc gcc-c 下载python3 wget --no-check-certificate https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz 编译python3 tar -xf Python-3.6.9.tar.xz cd Python-3.6.9 yum install -y…

自然语言处理:基于BERT预训练模型的中文命名实体识别(使用PyTorch)

命名实体识别&#xff08;NER&#xff09; 命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个关键任务&#xff0c;其目标是从文本中识别出具有特定意义的实体&#xff0c;并将其分类到预定义的类别中。这…

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型)

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 目录 Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 1. 项目说明 2. 数据说明 &#xff08;1&#xff09;心跳信号分类预测数据集 3. 模型训练 &#xff08;1&#xff09;项目安装 &…

十,[极客大挑战 2019]Secret File1

点击进入靶场 查看源代码 有个显眼的紫色文件夹&#xff0c;点击 点击secret看看 既然这样&#xff0c;那就回去查看源代码吧 好像没什么用 抓个包 得到一个文件名 404 如果包含"../"、"tp"、"input"或"data"&#xff0c;则输出"…

Windows远程桌面连接到Linux

我的电脑是一台瘦客户端&#xff0c;公司设置的不能安装其他软件&#xff0c;里面只有几个软件&#xff0c;还好有一个远程桌面&#xff08;Remote Desktop Connection&#xff09;&#xff0c;我想连接到另一台Linux的电脑上。 在Linux上安装xrdp&#xff1a; sudo apt insta…

视觉处理基础1

目录 一、CNN 1. 概述 1.1 与传统网络的区别 1.2 全连接的局限性 1.3 卷积思想 1.4 卷积的概念 1.4.1 概念 1.4.2 局部连接 1.4.3 权重共享 2. 卷积层 2.1 卷积核 2.2 卷积计算 2.3 边缘填充 2.4 步长Stride 2.5 多通道卷积计算 2.7 特征图大小计算方法 2…

泛化调用 :在没有接口的情况下进行RPC调用

什么是泛化调用&#xff1f; 在RPC调用的过程中&#xff0c;调用端向服务端发起请求&#xff0c;首先要通过动态代理&#xff0c;动态代理可以屏蔽RPC处理流程&#xff0c;使得发起远程调用就像调用本地一样。 RPC调用本质&#xff1a;调用端向服务端发送一条请求消息&#x…

C++ 之弦上舞:string 类与多样字符串操作的优雅旋律

string 类的重要性及与 C 语言字符串对比 在 C 语言中&#xff0c;字符串是以 \0 结尾的字符集合&#xff0c;操作字符串需借助 C 标准库的 str 系列函数&#xff0c;但这些函数与字符串分离&#xff0c;不符合 OOP 思想&#xff0c;且底层空间管理易出错。而在 C 中&#xff0…

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…

使用OpenCV和卡尔曼滤波器进行实时活体检测

引言 在现代计算机视觉应用中&#xff0c;实时检测和跟踪物体是一项重要的任务。本文将详细介绍如何使用OpenCV库和卡尔曼滤波器来实现一个实时的活体检测系统。该系统能够通过摄像头捕捉视频流&#xff0c;并使用YOLOv3模型来检测目标对象&#xff08;例如人&#xff09;&…

【closerAI ComfyUI】物体转移术之图案转移,Flux三重控制万物一致性生图,实现LOGO和图案的精准迁移

更多AI前沿科技资讯,请关注我们:closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性! 【closerAI ComfyUI】物体转移术之图…

2025软考高级《系统架构设计师》案例模拟题合集

首先分享一下系统架构设计师资料合集&#xff0c;有历年真题、自学打卡表、精华知识点等&#xff0c;需要的留邮&#xff0c;打包分享&#xff01; 1、在设计基于混合云的安全生产管理系统中&#xff0c;需要重点考虑5个方面的安全问题。设备安全、网络安全、控制安全、应用安全…