ElasticSearch01-概述
1、Elastic Stack
(1)简介
官网地址:https://www.elastic.co/cn/ ELK是一个免费开源的日志分析架构技术栈总称,包含三大基础组件,分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据搜索、分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。 ELK架构如下:
随着ELK的发展,又有新成员Beats、elastic cloud的加入,所以就形成了Elastic Stack。所以说,ELK是旧的称呼,Elastic Stack是新的名字。
(2)特点
全文搜索:Elasticsearch提供强大的全文搜索能力。 数据处理:Logstash用于数据收集、处理和转发。 数据可视化:Kibana提供数据可视化和仪表板功能。 接口简单:采用json形式RESTFUL API接受数据并响应,无关语言。 实时分析:支持实时数据处理和分析。 可扩展性:易于在分布式环境中水平扩展。 灵活性:高度可定制,适应不同数据处理需求。 开源:拥有活跃社区和丰富的插件生态。 数据集成:轻松集成多种数据源。 安全性:提供用户认证、授权和数据加密。 成本效益:作为开源解决方案,降低成本。 易用性:Kibana界面友好,简化数据探索。 监控与警报:支持设置监控规则和警报。
(3)组件介绍
Elasticsearch:
开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。 建立在Lucene之上,擅长全文搜索,是一个近乎实时的搜索平台。 Logstash:
服务器端数据处理管道,从多个来源摄取数据,对其进行转换,然后将其发送到Elasticsearch存储。 支持动态的数据收集、过滤、分析和丰富,拥有近200种插件。 Kibana:
开源数据可视化插件,提供查找、查看和交互存储在Elasticsearch索引中的数据的方式。 用于高级数据分析和可视化数据。 Beats:
Elastic Stack中负责数据采集的轻量级组件,包括Filebeat、Metricbeat、Packetbeat等。 从各种源头采集数据,并将数据发送到Elasticsearch或Logstash进行后续处理和分析。 例如,Filebeat用于收集和转发日志文件,Metricbeat用于收集系统和服务的运行指标。 Elastic Cloud:
提供在AWS、Google Cloud和Azure上部署托管型Elasticsearch和Kibana的能力。 作为Elasticsearch的开发公司,Elastic为云端的Elastic集群提供多项功能和贴心支持。
2、搜索原理
(1)搜索是什么
搜索:是一种信息检索技术,它允许用户从大量的数据中查找和获取特定的信息。 在计算机科学和信息技术领域,搜索通常涉及以下几个方面:
全文搜索:在文本中查找特定的词汇或短语,通常用于文档、书籍、网页等。 数据库搜索:在数据库中查询特定的数据记录。 网络搜索:使用搜索引擎在互联网上查找信息,如使用Google、Bing等搜索引擎。 文件系统搜索:在计算机的文件系统中查找文件或文件夹。 元数据搜索:根据文件、文档或其他数据对象的属性(如作者、日期、标签等)进行搜索。 语义搜索:理解用户查询的意图,并返回最相关的结果,而不仅仅是关键词匹配。 垂直搜索:专注于特定类型的数据或领域的搜索,如房地产搜索、旅游搜索等。 本地搜索:在用户的设备上进行的搜索,不依赖于网络。
(2)数据库做搜索局限性
扩展性限制:在处理大规模数据时,传统数据库的扩展能力有限,尤其是横向扩展。 非结构化数据处理:不擅长处理文本、图像等非结构化数据。 灵活性不足:数据库结构固定,难以适应数据模型的快速变化。 全表扫描问题:在缺乏有效索引的情况下,可能需要全表扫描,影响性能。 性能优化复杂:需要复杂的索引和查询优化来提升性能。 大数据查询效率:在大数据量下,查询效率可能下降,影响用户体验。 举例如下:如下数据,查询“中国足球”,数据库就非常难实现数据匹配,更何况更加复杂的文本。
文档 内容 Doc1 中国的足球队 Doc2 中国男子足球队 Doc3 中国男子划水队 Doc4 中国女子划水队
(3)全文检索
全文检索:一种信息检索技术,它允许用户搜索文档中的全文内容,而不仅仅是元数据或数据库字段。 以下是全文检索的一些关键特点:
关键词搜索:用户可以输入一个或多个关键词,系统会返回包含这些关键词的文档。 索引创建:在全文检索系统中,文档内容会被处理并存储在一个索引中,这个索引允许快速检索。 倒排索引:全文检索系统通常使用倒排索引来存储文档中每个词的位置信息,从而加快搜索速度。 相关性排序:搜索结果会根据相关性进行排序,相关性高的文档排在前面。 模糊匹配:支持模糊查询,即使用户输入的关键词有拼写错误或不完整,系统也能返回相关结果。 多语言支持:全文检索系统能够处理多种语言的文档,并且可以针对不同语言进行优化。 复杂查询:支持布尔查询(AND, OR, NOT)、短语搜索、通配符搜索等复杂查询。 性能优化:全文检索系统会通过各种优化技术,如缓存、分布式处理等,来提高搜索性能。 可扩展性:能够处理从小型文档集合到大规模数据集的搜索需求。 用户界面:提供用户友好的搜索界面,使用户能够轻松地输入查询并浏览结果。 安全性和权限:可以集成安全机制,控制对敏感文档的访问。 集成性:全文检索系统可以集成到现有的应用程序和工作流程中,提供无缝的搜索体验。
(4)倒排索引及其原理
定义
倒排索引(Inverted Index)是全文检索中最常用的数据结构之一,它极大地提高了搜索效率,尤其是在处理大量文本数据时。 倒排索引是一种索引方法,它将文档集合中的所有文档中出现的每个词作为索引Key记录下来,并为每个词提供一份包含该词的文档列表。当用户查询时,可以直接查找该词的索引,快速定位到包含该词的所有文档。 工作原理
文档 内容 Doc1 Java is the best programming language Doc2 PHP is the best programming language Doc3 Javascript is the best programming language
- 分词:首先,对文档集合中的每个文档进行分词处理,将文档分解成独立的词项。
文档 内容 分词 Doc1 Java is the best programming language Java,is,the,best,programming,language Doc2 PHP is the best programming language PHP,is,the,best,programming,language Doc3 Javascript is the best programming language Javascript,is,the,best,programming,language
- 构建词典:创建一个词典(Term Dictionary),记录所有不同的词项,并为每个词项分配一个唯一的标识符(如词ID)。
- 构建倒排列表:对于词典中的每个词项,创建一个倒排列表(Posting List),记录包含该词项的所有文档的文档ID。倒排列表还可能包含词项在文档中出现的位置信息(位置索引),以及词项在文档中出现的次数(词频)。
ID term 文档列表 1 is Doc1,Doc2,Doc3 2 the Doc1,Doc2,Doc3 3 best Doc1,Doc2,Doc3 4 programming Doc1,Doc2,Doc3 5 language Doc1,Doc2,Doc3 6 Java Doc1 7 PHP Doc2 8 Javascript Doc3
- 存储索引:将词典和倒排列表存储在数据库或文件系统中,以便快速检索。
- 查询处理:当用户提交查询时,会将查询的词进行分词处理,然后再将分词结果分别查找词典中与查询词项对应的倒排列表,快速检索出包含这些词项的文档列表。
- 结果合并:如果查询包含多个词项,系统需要合并这些词项的倒排列表,找出同时包含所有查询词项的文档。这个过程可能涉及到布尔逻辑(AND, OR, NOT)等操作。
- 相关性评分:根据词项在文档中的出现频率、位置信息、文档的长度等因素,计算文档与查询的相关性得分,并按照得分对结果进行排序。
3、ElasticSearch
(1)概述
官网地址:https://www.elastic.co/cn/products/elasticsearch Elasticsearch是一个基于Lucene的搜索引擎。对Lucene进行了良好的封装,简化开发,并提供了很多高级功能。
(2)关键特性
分布式:Elasticsearch天生就是分布式的,这意味着它可以很容易地扩展到数以百计的服务器,并且可以处理PB级别的数据。 高可用性:Elasticsearch设计为高可用的,它通过将数据复制到多个节点来实现这一点,这样即使某个节点失败,数据也不会丢失。 实时搜索:Elasticsearch提供了快速的搜索能力,可以实时地对数据进行索引和搜索。 多租户:Elasticsearch支持多租户架构,允许多个用户或应用在同一个集群上运行而不会相互干扰。 JSON文档:Elasticsearch使用JSON格式存储数据,这使得它易于与其他系统和编程语言集成。 RESTful接口:Elasticsearch提供了一个RESTful API,使得它可以通过HTTP请求进行操作。 分析和聚合:Elasticsearch提供了强大的分析和聚合功能,可以对数据进行复杂的查询和分析。 可扩展性:Elasticsearch可以很容易地通过增加更多的节点来扩展,以处理更多的数据和查询负载。 容错性:Elasticsearch具有自动故障转移和恢复的能力,可以在节点失败时自动重新分配数据和查询负载。
(3)发展历史
起源:Elasticsearch最初由Shay Banon在2010年创建,并在同年发布了第一个版本。Shay Banon创建Elasticsearch的初衷是为了解决传统关系型数据库无法满足的大规模数据搜索和分析需求。他希望构建一个分布式的、实时的搜索和分析引擎,基于Apache Lucene搜索引擎库,并在此基础上构建了更多的功能和特性,如分布式架构、实时索引、多数据类型支持、聚合分析等。 公司成立:2012年,Elasticsearch N.V.公司成立,专注于开发和支持Elasticsearch相关的开源项目。公司的成立标志着Elasticsearch项目的商业化和持续发展。 社区壮大:从2013年开始,Elasticsearch社区逐渐壮大,吸引了越来越多的开发者和用户参与其中。Elasticsearch社区不断推出新版本,发布了许多重要的功能和改进,如实时搜索、聚合分析、地理空间搜索等。 被收购与上市:2018年,Elasticsearch N.V.公司更名为Elastic,并于同年上市。Elastic公司不断壮大,成为了搜索和分析领域的领军企业之一。 版本发布:Elasticsearch经历了多个版本的迭代,从1.x系列到最新的8.x系列,每个版本都带来了新的特性和性能改进。例如,1.0.0版本引入了分布式搜索和实时索引的核心功能,而7.0版本开始增加对向量字段的支持,标志着Elasticsearch正式进入向量检索领域。 开源与成功:Elasticsearch的成功关键因素之一是其开源特性,以及除了搜索之外的不同用例,如日志管理、安全和分析。 向量检索发展:随着机器学习和人工智能的兴起,Elasticsearch在向量检索方面也有所发展。从5.x版本开始,社区尝试通过插件和基本的数学运算实现简单的向量检索功能。到了7.0版本,Elasticsearch正式开始增加对向量字段的支持,例如通过dense_vector类型。
(4)应用案例
Netflix:Netflix依赖Elasticsearch来监控客户服务操作、安全日志和消息系统。其可扩展性和灵活性导致了广泛的应用,支持公司内部的关键运营。 eBay:eBay在各种文本搜索和分析用例中使用Elasticsearch。他们定制的“Elasticsearch-as-a-Service”平台简化了集群配置,使eBay能够无缝处理大量数据。 Walmart:Walmart利用Elastic Stack获得客户购买模式的可操作洞察,监控商店性能指标,并实时分析销售数据。其强大的安全功能增强了监控能力,确保为客户提供安全和优化的购物体验。 Sony:Sony公司使用Elasticsearch作为信息搜索引擎。 Mozilla:Mozilla公司使用Elasticsearch进行单元或功能测试,测试结果以JSON的方式索引到Elasticsearch中,方便开发人员查找bug。 SoundCloud:SoundCloud使用Elasticsearch为1.8亿用户提供即时精准的音乐搜索服务。 StumbleUpon:StumbleUpon使用Elasticsearch每天为社区提供百万次的推荐服务。 Infochimps:Infochimps已经索引了25亿文档,总共占用4TB的空间。
4、常见搜索引擎对比
(1)Lucene
Lucene,直白地说,它就是一个jar包,封装好了各种建立倒排索引、匹配索引进行搜索的各种算法。我们可以引入Lucene,基于它的API进行开发。 Lucene是一个高性能、纯Java的全文检索引擎,它免费且开源,适用于任何需要全文检索的应用,尤其是跨平台的应用。 起源:Lucene最初由Doug Cutting于1999年创建,最初是为了创建一个基于全文搜索的邮件存档系统而开始开发Lucene。 开源与社区发展:2000年3月,Lucene在SourceForge上开源并提供下载。2001年9月,Lucene作为高质量的Java开源软件产品加入Apache软件基金会的Jakarta家族中。随着每个版本的发布,这个项目得到明显的增强,也吸引了更多的用户和开发人员。 版本发展:Lucene经历了多个版本的迭代,从最初的0.01版本(2000年3月)到后来的1.0版本(2000年10月),再到1.4版本(2004年7月)等。2005年,Lucene升级成为Apache顶级项目。 生态系统形成:随着Lucene的发展,其生态系统也逐渐形成。相关项目如Solr和Elasticsearch等基于Lucene的搜索引擎系统相继出现,为Lucene的应用提供了更多的功能和扩展性。 重要地位:Lucene在全文搜索领域占据了重要地位,它不仅是一个全文检索引擎,也是一个信息检索(IR)库,能够为应用程序添加索引和搜索能力。 社区认可:Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用,包括Apache软件基金会的网站、IBM的开源软件Eclipse等都采用了Lucene作为全文检索的引擎。 Lucene的发展历史充满了合作和开源社区的力量,得到了全球开发者和用户的认可和支持,成为了全文搜索引擎库中的一个非常成熟和强大的选择。
(2)Solr
起源与历史:
Solr最初由Yonik Seely于2004年创建,目的是为了在CNET Networks的公司网站上添加搜索功能。 2006年1月,Solr成为Apache软件基金会下的一个开源项目。 2016年,Solr发布了新版本6.0,支持并行SQL查询的执行。 目前最新的版本是8.6.0。 功能与特性:
Solr提供了先进的全文搜索功能。 它支持基于标准的开放接口,通过XML、JSON和HTTP查询和获取结果。 Solr高度可扩展和容错,能够有效地复制到另一个Solr搜索服务器。 可以通过HTML页面管理,使用XML配置达到灵活性和适配性。 拥有灵活的插件体系,新功能能够以插件的形式方便地添加到Solr服务器上。 强大的数据导入功能,数据库和其他结构化数据源都可以导入、映射和转化。 应用场景:
Solr广泛应用于电商平台、日志分析、内容管理系统等领域。 在电商平台中,Solr的全文检索和分类统计功能使得商品搜索的实现变得轻松。 在日志分析场景中,Solr可以快速对日志进行索引和检索,帮助运维人员高效地排查故障。 在内容管理系统(CMS)中,Solr可以轻松实现内容搜索功能,帮助用户快速查找文章、图片等资源。 与Lucene的区别:
Lucene是一个全文检索工具包,而Solr是一个基于Lucene的全文搜索服务,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 Solr可以独立运行,不提供构建UI的功能,但提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
(3)Solr VS Elasticsearch
安装与配置:
Elasticsearch更易于安装和配置,学习成本更低。 Solr的安装和配置比Elasticsearch要复杂一些。 数据源与索引:
Solr接受来自不同来源的数据,包括XML文件,CSV文件和从数据库中的表提取的数据以及常见的文件格式(如Microsoft Word和PDF)。 Elasticsearch也支持其他来源的数据,例如ActiveMQ,AWS SQS,DynamoDB(Amazon NoSQL),FileSystem,Git,JDBC,JMS,Kafka,LDAP,MongoDB,neo4j,RabbitMQ,Redis,Solr和Twitter等。 搜索与分析:
Solr专注于文本搜索。 Elasticsearch常用于查询、过滤和分组分析统计,Elasticsearch背后的团队也努力让这些查询更为高效。 索引间join操作:
Solr中,索引间进行join必须是单个分片和其他节点上的副本集进行关联来搜索文档间关系(例如SQL连接)。 Elasticsearch提供更高效的has_children和top_children查询来检索这样的相关文档。 可扩展性与分布式:
Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。 Elasticsearch可以在笔记本电脑上运行,也可以在承载了PB级数据的成百上千台服务器上运行,具有很好的水平扩展性。 性能:
在处理实时搜索应用时,Elasticsearch的效率明显高于Solr。 Solr在传统的搜索应用中表现好于Elasticsearch。 社区支持:
Solr有一个更大、更成熟的用户、开发和贡献者社区。 Elasticsearch也有一个活跃的社区,提供用户支持。 功能与插件:
Solr官方提供的功能更多。 Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供。 多租户支持:
Elasticsearch处理多租户(multitenancy)不需要特殊配置。 Solr则需要更多的高级设置。 备份与恢复:
Elasticsearch采用Gateway的概念,使得完备份更加简单。
5、Elasticsearch 核心概念
(1)索引(Index)
定义:索引是一系列文档的集合,类似于关系型数据库中的数据库。每个索引都有一个唯一的名称,并且这个名称在集群中是唯一的。 作用:索引用于存储和检索数据。在Elasticsearch中,索引可以被细分为多个分片(shard),每个分片都是一个独立的Lucene索引,可以托管在集群中的任何节点上。
(2)文档(Document)
定义:文档是Elasticsearch中的基本数据单元,通常以JSON格式表示。每个文档都有一个唯一的标识符(_id),并且属于一个特定的索引和类型(type)。 作用:文档是存储在索引中的数据的基本单位。每个文档都可以包含多个字段,这些字段可以是不同类型的数据(如字符串、数字、日期等)。
(3)类型(Type)
定义:类型是索引中的一个逻辑分区,用于区分不同种类的文档。在Elasticsearch 6.0之前,一个索引可以包含多个类型,但从6.0开始,Elasticsearch开始淡化类型的概念,推荐一个索引只包含一个类型,并计划在8.x版本中完全废弃类型。 作用:类型用于逻辑上区分同一索引中的不同种类的文档。例如,在一个名为“articles”的索引中,可以有一个类型为“blog_post”的文档,表示博客文章。
(4)分片(Shard)
定义:分片是索引的一个子集,每个分片都是一个独立的Lucene索引。一个索引可以包含多个分片,这些分片可以分布在不同的节点上。 作用:分片用于水平扩展Elasticsearch的存储和处理能力。通过将索引分成多个分片,可以将数据分布到多个节点上,从而提高系统的可扩展性和容错能力。
(5)副本(Replica)
定义:副本是对主分片(primary shard)的一个备份。每个主分片可以有一个或多个副本。 作用:副本用于提高系统的可用性和查询性能。通过在不同的节点上创建副本,可以在某个节点发生故障时,确保数据的可用性。同时,查询可以在主分片和副本上并行执行,从而提高查询性能。
(6)集群(Cluster)
定义:集群是由一个或多个节点组成的集合。集群中的节点共同工作,提供数据的存储和检索服务。 作用:集群用于实现数据的分布式存储和处理。通过将数据分布到多个节点上,可以提高系统的可扩展性和容错能力。
(7)节点(Node)
定义:节点是Elasticsearch的一个运行实例。每个节点都可以参与到集群中,提供数据的存储和检索服务。 作用:节点是Elasticsearch的基本运行单元。通过将多个节点组成一个集群,可以实现数据的分布式存储和处理。
(8)映射(Mapping)
定义:映射定义了文档的结构和字段的类型。每个索引都有一个映射,用于描述该索引中的文档的结构和字段的类型。 作用:映射用于指导Elasticsearch如何存储和检索文档中的数据。通过定义文档的结构和字段的类型,可以确保数据的一致性和查询的效率。
(9)Elasticsearch vs 数据库
数据库概念 ES概念 数据库Database 索引Index 表Table 类型Type,9.0版本后删除,现在默认都是_doc 数据行Row 文档Document 数据列Column 字段Field 约束 Schema 映射Mapping