1.近实时(Near Real Time,NRT)
elasticsearch 是一个近实时的搜索和分析平台,这意味着从索引文档到可搜索文档都会有一段微小的延迟(通常是1s以内)。这种延迟主要是因为 elasticsearch 需要进行数据刷新和索引更新。
在 elasticsearch 中,"近实时"(Near Real-Time, NRT)是指在数据被索引之后,它不会立即出现在搜索结果中,而是需要经过一个很短的延迟。这个延迟通常在一秒左右,但有时可能稍长。这种延迟主要是由于 elasticsearch 在内部进行数据刷新的方式导致的。
当你将文档添加或更新到 elasticsearch 时,它首先被索引到一个或多个主分片(Primary Shard)中。接下来,elasticsearch 会将这些更改同步到相关的副本分片(Replica Shard)中。这个过程被称为刷新(Refresh)。刷新间隔是可以配置的,默认值为 1 秒。在每次刷新后,新索引或更新的文档才会出现在搜索结果中。
elasticsearch 使用了一种叫做 "刷新"(Refresh)的机制来实现近实时搜索。刷新过程会将内存中的数据写入磁盘,并使这些数据可被搜索。默认情况下,elasticsearch 每隔一秒钟执行一次刷新操作。这个时间间隔可以根据实际需求进行调整,但应权衡刷新频率与系统性能之间的关系。
elasticsearch 的近实时搜索功能在很多应用场景下是非常有价值的。尽管 elasticsearch 不能提供严格意义上的实时搜索,但在大多数情况下,一秒钟的延迟已经足够满足用户的需求。同时,近实时搜索也使得 elasticsearch 能够在保持较高查询性能的同时,降低系统资源消耗。
在大多数情况下,这种短暂的延迟是可以接受的。然而,对于某些对实时性要求极高的应用场景,如金融交易、实时报警等,这种延迟可能是不可接受的。这时,可以考虑使用其他实时数据处理技术来辅助 elasticsearch,例如实时消息队列(如 Apache Kafka)或实时数据处理框架(如 Apache Flink 或 Apache Storm)。
总之,elasticsearch 的近实时搜索是一种折中的实时搜索方案。它允许数据在被索引后的极短时间内就可以被检索到,虽然存在一定的延迟,但在大多数情况下已经足够满足实际需求。但对于一些对实时性要求极高的应用,可能需要使用其他技术来满足实时性需求。
2.集群
- 一个 elasticsearch 集群是由一个或多个节点(node)组成的,这些节点共同协作来存储、索引和检索数据。集群提供数据的高可用性和扩展性。
- 集群(cluster)是一个或多个节点(node)的集合,这些节点将共同拥有完整的数据,并跨节点提供联合索引、搜索和分析功能。集群由唯一的名称标识(elasticsearch.yml配置文件中对应参数cluster.name),集群的名称是elasticsearch.yml配置文件中最重要的一个配置参数,默认名称为elasticsearch,节点只能通过集群名称加入集群。
- 一个 elasticsearch 集群是一个由一个或多个节点组成的实例,这些节点共同保存整个数据集并提供索引和搜索功能。集群具有一个唯一的名字,这个名字用于区分不同的 elasticsearch 集群。
- 请确保不要在不同的环境中使用相同的集群名称,否则可能会导致节点加入错误的集群。例如,可以使用loggingdev、loggingstage和loggingsprod来区分开发、预发布和生产环境的集群。
- 注意:只有一个节点的集群是有效的,而且有特殊的用处,尤其是可以在单节点集群进行快速的开发、测试。此外,可以存在多个独立的集群,每个集群都有自己唯一的集群名称。
- 集群的作用:
- 高可用性:通过在多个节点上分布式存储数据,elasticsearch 集群可以提高系统的可用性。如果某个节点发生故障,其他节点仍然可以继续处理请求。
- 扩展性:集群可以水平扩展,以支持更多的数据和请求。通过添加更多节点,可以增加处理能力和存储容量。
- 节点类型:
- 主节点(Master Node):负责集群的管理和协调工作,例如创建或删除索引、跟踪集群中的所有节点等。一个集群中只有一个主节点,但可以设置备用主节点以提高可用性。当主节点出现故障时,集群会自动选举新的主节点。
- 数据节点(Data Node):负责存储数据和处理数据相关的搜索、索引等操作。数据节点是集群中最常见的节点类型。它们执行 CRUD 操作、聚合以及其他数据操作。数据节点可以根据需要扩展,以提高集群的存储和计算能力。
- 协调节点(Coordinating Node):负责接收客户端请求,将请求分发给合适的节点,并将结果合并后返回给客户端。协调节点可以优化请求处理性能。它们不存储数据,但可以帮助分担主节点和数据节点的负载。
- 摄取节点(Ingest Node):负责预处理文档,例如执行数据转换、提取元数据等,然后将处理后的文档索引到数据节点。
- 集群健康状态: elasticsearch 使用颜色来表示集群的健康状况:
- 绿色(Green):所有主分片和副本分片都已分配并处于正常状态。
- 黄色(Yellow):所有主分片都已分配并处于正常状态,但部分副本分片尚未分配。此状态下,集群仍可以正常工作,但可用性较低。
- 红色(Red):部分主分片尚未分配,导致部分数据不可用。此状态下,集群可能无法正常工作。
3.节点
- 节点(node)是一个elasticsearch的运行实例,也就是一个进程(process),多个节点组成集群,节点存储数据,并参与集群的索引、搜索和分析功能。与集群一样,节点由一个名称表示,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不希望使用默认值,可以定义所需的任何节点名称。此名称对于集群管理很重要,因为在实际应用中需要确定网络中的哪些服务器对应于elasticsearch集群中的哪些节点。
- 可以通过集群名称将节点配置为加入特定集群。默认情况下,每个节点都被设置为加入一个名为elasticsearch的集群,这意味着,如果在网络上启动了多个节点,并且假设他们可以彼此发现,那么他们都将自动形成并加入一个名为elasticsearch的新节点集群。
- 在单个集群中,可以有任意多个节点。此外,如果当前网络上没有其他elasticsearch节点在运行,则默认情况下,启动单个节点将形成一个名为elasticsearch的集群。
- 注意:上面提到了节点实质是一个进程,因此服务器和节点可以是一对多的关系。还有一点需谨记,无论是开发环境、测试环境还是生产环境请配置有意义的节点名称。
- 节点的作用:elasticsearch 节点承担了一系列任务,包括数据存储、索引、搜索、聚合、分发请求等。通过合理分配节点角色和资源,可以实现集群功能和性能的优化。
- 节点的类型:elasticsearch 中有多种节点类型,每种类型承担不同的任务。以下是一些常见的节点类型:
- 主节点(Master Node):负责管理集群元数据,如创建、删除索引,跟踪分片分布等。
- 数据节点(Data Node):负责存储数据,执行与数据相关的操作,如索引文档、搜索、聚合等。
- 协调节点(Coordinating Node):负责接收客户端请求并将请求路由到适当的节点。
- 摄取节点(Ingest Node):负责预处理文档,例如数据清洗、转换、增强等。
- 机器学习节点(Machine Learning Node):用于运行 elasticsearch 的机器学习功能,例如异常检测、预测等。
- 节点配置:在 elasticsearch 的配置文件(如 elasticsearch.yml)中,可以为节点分配角色、设置名称、分配资源等。这有助于实现节点的优化配置和集群的负载均衡。
- 节点间通信:elasticsearch 节点之间通过集群内的网络进行通信,如主节点与数据节点之间的通信,以确保集群状态的一致性。此外,协调节点与其他节点之间的通信有助于分发请求和合并响应。
- 节点故障与恢复:当一个节点发生故障时,集群会自动进行调整。例如,如果主节点发生故障,其他节点会通过选举产生新的主节点。对于数据节点,故障副本分片会被提升为主分片,以确保数据可用性。
通过对 elasticsearch 节点的理解,可以更有效地进行集群管理和优化,提高搜索和分析性能。在实际应用中,根据业务需求和资源限制,可以灵活调整节点配置和分配,实现集群的高可用性和高性能。
4.索引
- 索引是一个文档数据的集合。每个索引都有唯一的名称,用户通过这个名称来操作它。
- 索引(index)是具有某种相似特性的文档集合。例如,可以有存储客户数据的索引,存储产品目录的索引,以及存储订单数据的索引。索引由一个名称(必须全部是小写)标识,当对其中的文档执行索引、搜索、更新和删除操作时,该名称指向这个特定的索引。
- 在单个集群中,可以定义任意多个索引。
- 在使用传统的关系型数据库时,如果对数据有存取和更新操作,需要建立一个数据库。相应地,在elasticsearch中则需要建立索引。用户的数据新增、搜索和更新等操作的对象全部对应索引。但是,elasticsearch中的索引和Lucene中的索引不是一一对应的。elasticsearch中的一个索引对应一个或多个索引,这是由其分布式的设计方案决定的。
- 定义:在 elasticsearch 中,索引是具有相似特征的文档(Document)集合。可以将索引看作是数据库中的一个表,而文档则类似于表中的行。索引用于组织、存储和检索相关数据。
- 索引名称:每个索引都有一个唯一的名称,用于在执行搜索、索引和删除操作时进行标识。索引名称应当小写,可以包含字母、数字、下划线和连字符等字符。
- 映射(Mapping):映射定义了索引中文档及其包含的字段如何存储和索引。它相当于数据库表的字段定义和类型约束。映射包含了字段名、字段类型、分析器设置等信息。
- 分片(Shard)与副本(Replica):为了实现水平扩展和提高数据可用性,elasticsearch 将索引分为多个分片。每个分片都是一个独立的 Lucene 索引,可以托管在集群的任何节点上。分片的数量在创建索引时设定,之后不可更改。副本是分片的拷贝,用于提高数据可用性和查询性能。副本分片可以在运行时动态增加或减少。
- 数据操作:在 elasticsearch 中,可以对索引执行各种数据操作,如添加、修改、删除文档以及执行搜索查询等。这些操作通过 RESTful API 进行,通常使用 JSON 格式的请求和响应。
- 索引生命周期管理(ILM):elasticsearch 提供了索引生命周期管理功能,可以根据需求自动执行索引的创建、优化、备份和删除等操作。这有助于保持数据的最佳状态,同时优化资源利用。
5.类型
elasticsearch 中的类型(Type)是早期版本中使用的一个概念,用于在同一个索引中存储不同类型的文档。如用户数据、订单数据等。一个索引中只存放一类数据。类型可以理解为索引内的逻辑分类,类似于关系型数据库中的表。然而,从 elasticsearch 6.x 开始,类型的使用受到了限制,并在elasticsearch 7.x 版本中完全被移除。因此,在 elasticsearch 7.x 及以后的版本中,不再使用类型,而是推荐使用不同的索引来代替。
类型的移除是基于以下原因:
- 性能问题:使用多个类型可能导致性能问题。因为在 elasticsearch 底层,每个索引的所有类型都存储在同一个 Lucene 索引中。这样一来,具有不同类型的文档可能会导致稀疏字段问题(Sparse Field Problem),从而影响搜索性能。
- 模型复杂性:类型会导致数据模型变得复杂,使得开发人员需要处理更多与类型相关的问题,比如字段名冲突、映射更新等。
- 索引扁平化:去除类型后,elasticsearch 的索引结构更加扁平化,简化了查询操作,使得开发者更容易理解和使用。
- 扩展性限制:由于同一个索引的所有类型共享相同的分片数量设置,因此难以根据每个类型的数据量和查询需求对分片数量进行调整。
为了适应类型的移除,elasticsearch 推荐的做法是将原本使用类型的场景转换为使用多个索引。这样,每个索引代表一个逻辑实体,可以独立拥有自己的映射和设置。在这种情况下,可以利用别名(Alias)功能将多个索引组合在一起,以便执行跨索引查询。
elasticsearch 开发团队决定在 7.x 及以后的版本中移除类型概念。取而代之的是,推荐使用单一类型的索引,即每个索引只包含一种类型的文档。这样可以避免上述问题,提高性能和扩展性。如果需要对文档进行逻辑分类,可以使用自定义字段来替代原先的类型。
虽然类型已被移除,了解类型的概念仍然有助于理解 elasticsearch 的发展历程,以及为什么在新版本中不再推荐使用类型。
6.文档
- 文档(document)是可以被索引的基本信息单元。例如,可以为单个客户创建一个文档,为单个产品创建另一个文档,以及为单个订单创建另一个文档。文档以JSON表示,JSON是一种普遍存在的Internet数据交换的格式。在单个索引中,理论上可以存储任意多的文档。
- 用JSON格式来表示,存储在索引库中的一条数据。
- 在使用传统的关系型数据库时,需要把数据封装成数据库中的一条记录,而在elasticsearch中对应的则是文档。elasticsearch的文档中可以有一个或多个字段,每个字段可以是各种类型。用户对数据操作的最细粒度对象就是文档。elasticsearch文档操作使用了版本的概念,即文档的初始版本为1,每次的写操作会把文档的版本加1,每次使用文档是,elasticsearch返回给用户的是最新版本的文档。另外,为了减轻集群负载和提升效率,elasticsearch提供了文档的。
- 文档 ID:每个文档都有一个唯一的标识符,称为文档 ID。可以在创建文档时指定文档 ID,也可以让 elasticsearch 自动生成。文档 ID 用于在执行文档操作(如更新、删除和检索)时进行标识。
- 索引:文档存储在 elasticsearch 中的索引(Index)中。一个索引可以包含多个具有相似特征的文档,类似于关系型数据库中的表。索引负责组织、存储和检索文档。
- 映射:映射(Mapping)定义了文档及其包含的字段如何存储和索引。映射相当于数据库表的字段定义和类型约束。它描述了文档的结构、字段类型、分析器设置等信息。
- 字段:每个文档都由一组字段组成。字段是文档中的基本信息单元,它们可以包含字符串、数字、布尔值、日期等数据类型。
- 分析器:分析器用于处理文档中的文本数据,将其拆分为单独的单词并进行标准化处理,以便进行搜索和查询。分析器是在字段级别定义的。
- 索引操作:在 elasticsearch 中,可以对文档执行各种操作,如添加、修改、删除以及执行搜索查询等。这些操作通过 RESTful API 进行,通常使用 JSON 格式的请求和响应。
- 全文搜索和分析:elasticsearch 可以对文档进行全文搜索和分析。这意味着你可以使用 elasticsearch 查询文档中的特定字段,对文档进行复杂的搜索和聚合操作。
- 关系:虽然 elasticsearch 主要是一个面向文档的搜索引擎,但它也支持一定程度的关联文档查询。例如,可以使用嵌套对象(nested objects)和父子关系(parent-child relationships)在文档之间建立关联关系。
- _source 字段:在 elasticsearch 中,每个文档都有一个名为 "_source" 的字段,它包含了文档的原始 JSON 数据。该字段在默认情况下是存储在 elasticsearch 中的,但可以通过映射定义将其禁用或部分禁用。
文档在 elasticsearch 中的主要操作有:
- 索引文档:向 elasticsearch 索引添加文档的过程称为索引文档。在索引文档时,需要指定一个唯一的文档 ID。如果不指定文档 ID,elasticsearch 会自动生成一个。
- 更新文档:可以使用文档 ID 来更新 elasticsearch 中的文档。更新操作可以是全量更新(替换整个文档)或部分更新(修改部分字段)。
- 删除文档:通过指定文档 ID,可以从 elasticsearch 索引中删除文档。
- 搜索文档:elasticsearch 提供了丰富的查询功能,可以根据不同的条件检索文档。查询可以是简单的全文检索,也可以是复杂的结构化查询和聚合分析。
7.分片和副本
- 索引可能会存储大量数据,这些数据可能会超出单个节点的硬件限制。例如,占用1TB磁盘空间的10亿个文档的单个索引可能超出单个节点的磁盘容量,或者速度太慢,无法满足搜索请求的性能要求。
- 为了解决这个问题,elasticsearch提供了将索引水平切分为多段(成为分片,shard)的能力。创建索引时,只需定义所需的分片数量。每个分片本身就是一个具有完全功能的独立"索引",可以分布在集群中的任何节点上。
- 分片:
- 在分布式系统中,为了能存储和计算海量的数据,会先对数据进行切分,然后再将它们存储到多台计算机中。这样不仅能分担集群的存储和计算压力,而且在该架构基础上进一步优化,还可以提升系统中数据的高可用性。在elasticsearch中,一个分片对应的就是一个Lucene索引,每个分片可以设置多个副本分片,这样当主分片所在的计算机因为故障而离线时,副分片会充当主分片继续服务。索引的分片个数只能设置一次,之后不能更改。在默认情况下,elasticsearch的每个索引设置为5个分片。
- 分片很重要,主要有几个原因:
- 分片可以水平拆分数据,实现大数据存储和分析。
- 可以跨分片(可能在多个节点上)进行分发和并行操作,从而提高性能和吞吐量。如何分配分片以及如何将其文档聚合回搜索请求的机制完全由elasticsearch管理,并且对用户是透明的。在随时可能发生故障的网络和云环境中,如果某个分片或节点以某种方式脱机或因何种原因丢失,则强烈建议用户使用故障迁移机制。为此,elasticsearch提出了将索引分片复制一个或多个拷贝,成为副本(replica)。
- 在创建索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的”索引“,可以被放置在集群的任意节点上,从而实现负载均衡。
- 副分片:
- 为了提升系统索引数据的高可用性并减轻集群搜索的负载,可以启用分片的副本,该副本叫作副分片,而原有分片叫主分片。在一个索引中,主分片的副分片个数是没有限制的,用户可以按需设定。在默认情况下,elasticsearch不会为索引的分片开启副分片,用户需要手动设置。副分片的个数设定后,也可进行更改。一个分片的主分片和副本分片分别存储在不同计算机上。如图所示为一个3节点的集群,某个索引设置了2个主分片,每个主分片分配两个副本分片。图中深色方框中的P表示该分片为主分片,R表示该分片为副分片,P和R后面的数字表示其编号。在极端的情况下,当只有一个节点时,如果索引的副分片个数设置大于1,则系统只分配主分片,而不会分配副分片。
- 分片:
- 可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,还可以随时动态更改副本的数量。分片的数量理论上不可变更,唯一的办法重建索引,重新定义分片的数量。但还是可以使用_shrink和_split API 更改索引的分片数量,但这不是通常的做法,预先评估准确的分片数量才是最佳方法。
- 默认情况下,elasticsearch中的每个索引都分配一个主分片和一个副本,这意味着如果集群中至少有两个节点,则索引将有一个主分片和另一个副本分片(一个完整副本),每个索引总共有两个分片。
在 elasticsearch 中,分片(Shard)和副本(Replica)是用于控制 elasticsearch 集群的数据存储和可用性的两个重要概念。
- 分片:分片是将一个索引(Index)拆分成多个部分的过程。每个分片可以存储一部分文档,并分布在不同的节点上。分片的主要目的是允许 elasticsearch 分布式地处理大型数据集。分片数量可以设置,通常根据索引的大小和查询负载来确定。
- 副本:副本是分片的一个复制,用于提高 elasticsearch 集群的可用性和性能。每个分片可以有多个副本,副本分布在不同的节点上,并包含与原始分片相同的数据。副本的主要目的是允许 elasticsearch 在节点失效或网络故障时继续提供服务。副本数量可以设置,通常根据 elasticsearch 集群的规模和可靠性要求来确定。
分片和副本的数量可以在索引创建时进行设置,也可以在运行时进行更改。通常,建议设置至少一个副本,以确保 elasticsearch 集群的可用性。如果需要更高的可靠性和容错能力,则可以增加副本数量。然而,增加副本数量会增加索引的存储和网络带宽开销。
总之,分片和副本是 elasticsearch 中用于控制数据存储和可用性的重要概念。了解它们的作用和设置方法可以帮助用户更好地利用 elasticsearch 的分布式能力和容错机制。
8.字段
一个文档可以包含一个或多个字段,每个字段都有一个类型与其对应。除了常用的数据类型(如字符型、文本型和数值型)外,elasticsearch还提供了多种数据类型,如数组型、经纬度型和IP地址类型等。elasticsearch对不同类型的字段可以支持不同的搜索功能。例如,当使用文本类型的数据时,可以按照某种分词方式对数据进行搜索,并且可以设定搜索后的打分因子来影响最终的排序。再如,使用经纬度的数据时,elasticsearch可以搜索某个地点附近的文档,也可以查询地理围栏内的文档。在排序函数的使用上,elasticsearch也可以基于某个地点按照衰减函数进行排序。
以下是 elasticsearch 字段的一些重要特点:
- 字段有一个字段名:每个字段都有一个字段名,用于在文档中唯一标识该字段。字段名应当小写,可以包含字母、数字、下划线和连字符等字符。
- 字段属于一个文档:在 elasticsearch 中,每个字段都属于一个文档。文档是具有相似特征的数据集合,通常被存储在一个索引(Index)中。
- 字段具有类型:每个字段都具有一个类型,用于确定字段值的数据类型。常见的字段类型包括字符串、数字、日期等。elasticsearch 还支持嵌套字段和地理位置字段等。
- 字段可以包含多个值:每个字段可以包含多个值,这在一些场景下非常有用。例如,一个商品文档可能包含多个颜色选项和多个尺寸选项。
- 字段可以是嵌套的:elasticsearch 中的字段可以是嵌套的。嵌套字段可以在一个文档中包含另一个文档,形成类似于嵌套对象的结构。嵌套字段通常用于表示具有层次结构的数据,例如一篇文章中的段落和句子等。
- 字段可以动态添加:elasticsearch 允许在文档中动态添加字段。如果新字段没有在映射中定义,elasticsearch 会自动创建一个新的字段,并根据字段值自动推断字段类型。
- 字段可以使用分析器进行处理:分析器是 elasticsearch 用于处理文本的一种工具。它可以将原始文本拆分为单词,并对这些单词进行转换和过滤,以便更好地支持全文搜索和聚合操作。每个字段都可以指定一个分析器。
- 字段可以被索引、查询和聚合:elasticsearch 中的字段可以被索引、查询和聚合。索引字段是为了支持文本搜索,查询字段是为了根据条件筛选文档,聚合字段是为了对文档进行分组和统计。
9.映射
建立索引时需要定义文档的数据结构,这种结构叫作映射。在映射中,文档的字段类型一旦设定后就不能更改。因为字段类型在定义后,elasticsearch已经针对定义的类型建立了特定的索引结构,这种结构不能更改。借助映射可以给文档新增字段。另外,elasticsearch还提供了自动映射功能,即在添加数据时,如果该字段没有定义类型,elasticsearch会根据用户提供的该字段的真实数据来猜测可能的类型,从而自动进行字段类型的定义。
下面是一些关于 elasticsearch 映射的重要特点:
- 映射定义了字段名、字段类型、分析器等信息:每个字段都有一个字段名和一个字段类型,用于在索引和搜索时进行类型检查和转换。字段类型可以是基本类型,例如字符串、数字、日期、布尔等,也可以是复杂类型,例如对象、数组、嵌套对象等。映射还可以定义分析器(Analyzer),用于在索引和搜索时对文本进行分词和过滤。
- 映射可以手动创建或自动推断:elasticsearch 中的映射可以手动创建,也可以自动推断。如果没有映射,elasticsearch 会根据文档中的字段自动创建映射,并根据字段值自动推断字段类型。但自动推断可能不够准确,因此建议在创建索引时手动指定映射。
- 映射可以动态添加或修改:在 elasticsearch 中,可以在运行时动态添加或修改映射。这对于需要在已有索引中添加新字段或修改字段类型的情况非常有用。但是,如果映射已经被创建并且被使用,则不能修改它的字段类型。
- 映射可以定义字段的存储方式:elasticsearch 中的字段可以存储在不同的方式中,例如存储在原始形式下、存储在索引中但不分词等。映射可以定义字段存储的方式,以满足不同的索引和搜索需求。
- 映射可以有多个版本:在 elasticsearch 中,可以为每个索引的映射定义多个版本。每个版本都有一个唯一的名称,可以在运行时进行切换。这对于需要对映射进行更新或回滚的情况非常有用。
10.DSL
elasticsearch使用DSL(Domain Specific Language,领域特定语言),来定义查询。与编程语言不同,DSL是在特定领域解决特定任务的语言,它可以有多种表达形式,如我们常见的HTML、CSS、SQL等都属于DSL。elasticsearch中的DSL采用JSON进行表达,相应地,ES也将响应客户端请求的返回数据封装成了JSON形式。这样不仅可以简单明了地表达请求/响应内容,而且还屏蔽了各种编程语言之间数据通信的差异。
elasticsearch 提供了两种主要类型的 DSL:
- 查询 DSL:查询 DSL 用于构建用于搜索文档的查询。它可以使用各种过滤器、查询和聚合功能,以及组合和嵌套这些功能来构建复杂的查询。
- 聚合 DSL:聚合 DSL 用于执行聚合操作,以便从文档集合中提取有意义的统计信息。它可以使用各种聚合器,例如平均值、最小值、最大值、总计数等。
elasticsearch 其他类型的 DSL:
- 过滤器 DSL:过滤器 DSL 可以用于过滤文档,从而返回符合特定条件的文档。过滤器 DSL 可以根据数据类型、日期范围、地理位置等多个维度进行过滤。
- 索引管理 DSL:elasticsearch 也提供了索引管理 DSL,用于创建、修改、删除索引及相关设置。索引管理 DSL 可以用于设置分片数量、副本数量、映射、分析器等。
- 自定义脚本 DSL:elasticsearch 还提供了自定义脚本 DSL,用于实现一些高级查询和计算。自定义脚本 DSL 可以使用脚本语言编写自定义脚本,用于执行计算、过滤、聚合等操作。
以下是一些常见的 elasticsearch DSL 查询语句示例:
- Match Query:匹配查询是最常用的查询之一,可以使用该查询根据关键字搜索文本字段。
- Term Query:术语查询用于搜索包含特定术语的字段。它不会对输入的术语进行分词或归一化。
- Range Query:范围查询用于搜索包含在特定范围内的数值或日期的字段。
- Bool Query:布尔查询用于组合多个查询,以便构建更复杂的查询。
- Wildcard Query:用于在指定字段中执行通配符搜索。
- Prefix Query:用于在指定字段中匹配以指定前缀开头的词项。
- Fuzzy Query:用于在指定字段中执行模糊搜索。
以下是一些常见的 elasticsearch DSL 聚合语句示例:
- Terms Aggregation:术语聚合用于统计文档集合中各个术语的出现次数,并根据计数结果对它们进行分组。
- Date Histogram Aggregation:日期直方图聚合用于按时间段分组文档集合。例如,将文档按月、周、日等时间段进行分组。
- Range Aggregation:范围聚合用于将文档分组到特定范围内,例如将销售数据按销售额范围分组。
- Metric Aggregations:用于计算数据的各种度量指标,例如平均值、最大值、最小值等。
- Bucket Aggregations:用于将数据分成各种桶,并对每个桶内的数据执行聚合操作,例如按日期范围分桶、按字段值分桶等。
- Pipeline Aggregations:用于对其他聚合结果进行操作,例如计算移动平均值、比较不同桶内数据的百分比等。
下面是一些关于elasticsearch DSL 的重要特点:
- DSL 是基于 JSON 格式的:DSL 是基于 JSON 格式的查询语言。每个查询和聚合都可以表示为一个 JSON 对象,其中包含各种属性和值,用于定义查询或聚合的各种参数和选项。
- DSL 可以进行高级查询:DSL 可以用于执行各种高级查询操作,例如模糊查询、范围查询、多字段查询、组合查询等。DSL 还支持词条和短语查询、前缀和通配符查询等。
- DSL 可以进行聚合操作:DSL 还可以用于执行聚合操作,例如计算总数、平均值、最大值、最小值等。聚合可以嵌套并在多个字段上执行。
- DSL 可以进行过滤操作:DSL 还可以用于执行过滤操作,例如基于特定条件过滤结果集,过滤结果范围等。过滤可以帮助排除无用的结果并提高查询性能。
- DSL 支持链式调用:DSL 支持链式调用,可以将多个查询、聚合和过滤操作串联在一起,以构建复杂的查询和聚合链。链式调用也可以增强查询的可读性和可维护性。
总之,DSL 是 elasticsearch 中的一种重要语言,用于构建各种查询和聚合操作。
11.知识点
其实每个elasticsearch分片都是一个完整的Lucene索引。在一个Lucene索引中,可以有大量的文档。从Lucene-5843起,限制2147 483 519(=integer.max_value-128)个文档。可以使用_cat/shards api监视分片大小。
注意:分片和副本机制是elasticsearch实现分布式、水平扩展、高并发、高容错功能的核心。通过分片机制实现大数据的分布式存储,通过副本机制实现了集群的容错、高性能和水平扩展。elasticsearch是弹性、可伸缩的意思,elasticsearch的弹性、可伸缩性是建立在分片和副本的基础上的。
12.分片和副本区别
- 本质上分片和副本都是一个完整的Lucenes索引,存储的数据也是完全相同的,都可以成为分片。
- 假设一个索引定义了3个分片、2个副本,那么总共就是9个分片,其中3个是主分片,每个主分片有2个副本。主分片就是建立索引时首先建立的分片,或者说当主分片失效时会重新选出一个副本作为主分片。
- 当索引时,数据会首先到达主分片,然后再把请求分发到其他副本。
- 当搜索时,主分片和副本都可以接受请求、搜索和分析数据,二者没有区别。
- 数据存储方式不同:分片和副本的数据存储方式不同。每个分片存储索引的一部分数据,而每个副本存储与其对应的分片完全相同的数据。
- 数量限制不同:分片的数量可以在索引创建时进行设置,但副本的数量可以在任何时候进行更改。默认情况下,每个索引具有一个主分片和一个副本分片,但可以根据需要增加更多的分片和副本。
- 数据分发方式不同:分片和副本的数据分发方式不同。分片通过分布在不同节点上的多个分片来分发数据。副本通过将主分片的数据复制到其他节点来分发数据。
- 数据冗余方式不同:分片和副本的数据冗余方式不同。分片通过将数据分布在不同节点上来提高可用性,而副本通过将主分片的数据复制到其他节点来实现数据冗余。
- 读写操作方式不同:分片和副本的读写操作方式不同。主分片负责所有的写操作和部分读操作,而副本分片只负责部分读操作。这样可以确保所有写操作都集中在一个分片上,并保持数据的一致性。
下面是分片和副本的主要区别:
- 分片:分片是将一个索引(Index)拆分成多个部分的过程。每个分片可以存储一部分文档,并分布在不同的节点上。分片的主要目的是允许 elasticsearch 分布式地处理大型数据集。分片可以设置数量,通常根据索引的大小和查询负载来确定。
- 副本:副本是分片的一个复制,用于提高 elasticsearch 集群的可用性和性能。每个分片可以有多个副本,副本分布在不同的节点上,并包含与原始分片相同的数据。副本的主要目的是允许 elasticsearch 在节点失效或网络故障时继续提供服务。副本数量可以设置,通常根据 elasticsearch 集群的规模和可靠性要求来确定。
因此,分片和副本的主要区别在于它们的目的和作用。分片用于将索引拆分为多个部分,以便 elasticsearch 可以分布式地处理大型数据集。副本则用于提高 elasticsearch 集群的可用性和性能,并允许在节点失效或网络故障时继续提供服务。
13.关系型数据库和elasticsearch比较
关系型数据库(MySql、Oracle、SQL Server) | elasticsearch |
---|---|
数据库 | 索引 |
表 | 类型(6.0.0废弃) |
行 | 文档 |
列 | 字段 |
表结构 | 映射 |
- 在关系型数据库中,用户会创建数据库;在elasticsearch中对应的是创建索引,俗称索引库。
- 关系型数据库中的表在elasticsearch中已经没有对应的项。
- 对于关系型数据库中的行,在elasticsearch中称为文档。
- 而关系型数据库的列在elasticsearch中是由字段体现的。
- 关系型数据库的表结构在elasticsearch中是由映射体现的。
因此,elasticsearch的大体架构就是创建索引库,也可以给索引库指定映射和字段类型,在elasticsearch索引库中存储的基本单位就是文档数据