赞
踩
官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html
API文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html
Elastic Search 文档型数据库,文档是基础存储单元,所有的数据以json的形式存储在数据库中,es的优势在于查询,使用lucene 查询引擎,可以实现对字段等信息的快速查找,基于java语言开发,lucene将词组进行分类,按照词组类型,进行快速检索。同时,es也是一种分布式存储数据库,多台es数据端服务器,可以组成es数据集群,通过客户端访问该集群,可以实现对服务对象的透明化管理.
趣闻:
Lucene 是一个高性能的搜索引擎库,它提供索引数据和搜索数据的功能,内部非常复杂,elasticsearch利用了lucene的高性能,封装了它的复杂性,对外可以提供rest接口,不同语言的应用都可以调用。2004年,shay banon失业了,准备给他厨师老婆做一个食谱的搜索引擎,如果直接使用Lucene很难,所以他把使用lucene抽象了一下,并开源了,开发者可以直接在程序里使用compass来进行搜索,2010年的时候,它已经重构了compass,取名为elasticsearch,支持分布式和水平扩展。
ES中的一些关键概念:
平台:vbox 虚拟机
操作系统:fedaro 36
ES版本:8.12.0
部署步骤:
rpm -i elasticsearch-8.12.0-x86_64.rpm
以上步骤即可完成一个es的一个简单安装过程
下面展示一个es的一个默认配置文件:
# ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticsearch comes with reasonable defaults for most settings. # Before you set out to tweak and tune the configuration, make sure you # understand what are you trying to accomplish and the consequences. # # The primary way of configuring a node is via this file. This template lists # the most important settings you may want to configure for a production cluster. # # Please consult the documentation for further information on configuration options: # https://www.elastic.co/guide/en/elasticsearch/reference/index.html # # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # #cluster.name: my-application # # ------------------------------------ Node ------------------------------------ # # Use a descriptive name for the node: # #node.name: node-1 # # Add custom attributes to the node: # #node.attr.rack: r1 # # ----------------------------------- Paths ------------------------------------ # # Path to directory where to store the data (separate multiple locations by comma): # path.data: /var/lib/elasticsearch # # Path to log files: # path.logs: /var/log/elasticsearch # # ----------------------------------- Memory ----------------------------------- # # Lock the memory on startup: # #bootstrap.memory_lock: true # # Make sure that the heap size is set to about half the memory available # on the system and that the owner of the process is allowed to use this # limit. # # Elasticsearch performs poorly when the system is swapping the memory. # # ---------------------------------- Network ----------------------------------- # # By default Elasticsearch is only accessible on localhost. Set a different # address here to expose this node on the network: # #network.host: 192.168.0.1 # # By default Elasticsearch listens for HTTP traffic on the first free port it # finds starting at 9200. Set a specific HTTP port here: # #http.port: 9200 # # For more information, consult the network module documentation. # # --------------------------------- Discovery ---------------------------------- # # Pass an initial list of hosts to perform discovery when this node is started: # The default list of hosts is ["127.0.0.1", "[::1]"] # #discovery.seed_hosts: ["host1", "host2"] # # Bootstrap the cluster using an initial set of master-eligible nodes: # #cluster.initial_master_nodes: ["node-1", "node-2"] # # For more information, consult the discovery and cluster formation module documentation. # # ---------------------------------- Various ----------------------------------- # # Allow wildcard deletion of indices: # #action.destructive_requires_name: false #----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------------- # # The following settings, TLS certificates, and keys have been automatically # generated to configure Elasticsearch security features on 31-01-2024 05:29:02 # # -------------------------------------------------------------------------------- # Enable security features xpack.security.enabled: true xpack.security.enrollment.enabled: true # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents xpack.security.http.ssl: enabled: true keystore.path: certs/http.p12 # Enable encryption and mutual authentication between cluster nodes xpack.security.transport.ssl: enabled: true verification_mode: certificate keystore.path: certs/transport.p12 truststore.path: certs/transport.p12 # Create a new cluster with the current node only # Additional nodes can still join the cluster later cluster.initial_master_nodes: ["localhost"] # Allow HTTP API connections from anywhere # Connections are encrypted and require user authentication http.host: 0.0.0.0 # Allow other nodes to join the cluster from anywhere # Connections are encrypted and mutually authenticated #transport.host: 0.0.0.0 #----------------------- END SECURITY AUTO CONFIGURATION -------------------------
下面就几个重点配置说明:
cluster.name: my-application 集群名称,对于同一个集群中的节点,该配置应该是相同的
node.name: node-1 节点名称: 对于同一个集群中的不同节点,都应该有对应的节点名称
path.data: /var/lib/elasticsearch : es 数据存储位置
path.logs: /var/log/elasticsearch: es 日志存储位置
network.host: 192.168.0.1: 节点ip
http.port: 9200: http 访问端口
discovery.seed_hosts: [“host1”, “host2”] : 集群配置信息(对于这个配置还有另外一种表示方式,后面会做出说明)
cluster.initial_master_nodes: [“node-1”, “node-2”]:指定被选为主节点的节点名称
xpack.security.enabled: true:es 安全扩展包是否启用
xpack.security.enrollment.enabled: true:启用自动节点加入功能(为简化集群部署用的)
默认情况下,es服务监听9200端口用于向客户端提供服务,当使用rpm包安装结束之后,默认开启x-pack 扩展安全功能,次功能包括是否允许ssl加密通讯,账号密码管理等,后面为了方便测试与实验,将关闭xpack 部分功能,主要包括登录验证,ssl加密通讯。
下面是单节点es部署基本配置信息:
相较于前面给出的默认配置,进行了相应的调整,
cluster.name: myapp node.name: node1 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 172.16.20.73 http.port: 9200 xpack.security.enabled: false xpack.security.enrollment.enabled: true # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents xpack.security.http.ssl: enabled: false keystore.path: certs/http.p12 # Enable encryption and mutual authentication between cluster nodes xpack.security.transport.ssl: enabled: false verification_mode: certificate keystore.path: certs/transport.p12 truststore.path: certs/transport.p12 cluster.initial_master_nodes: ["node1"] http.host: 0.0.0.0
以上配置删减了注释信息,这时候使用systemctl restart elasticsearch
即可成功将es服务启动
使用systemctl status elasticsearch
查看服务状态
[root@localhost elasticsearch]# systemctl status elasticsearch elasticsearch.service - Elasticsearch Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; preset: disabled) Drop-In: /usr/lib/systemd/system/service.d └─10-timeout-abort.conf Active: active (running) since Wed 2024-01-31 13:13:11 CST; 1h 49min ago Docs: https://www.elastic.co Main PID: 1707 (java) Tasks: 92 (limit: 4645) Memory: 1.4G CPU: 1min 58.844s CGroup: /system.slice/elasticsearch.service ├─1707 /usr/share/elasticsearch/jdk/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/elasticsearch/bin/elasticsearch -Dcli.libs=lib> ├─1767 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -Djava.security.manager=allow -XX:+AlwaysPreT> └─1788 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller Jan 31 13:12:46 localhost.localdomain systemd[1]: Starting elasticsearch.service - Elasticsearch... Jan 31 13:12:48 localhost.localdomain systemd-entrypoint[1767]: CompileCommand: exclude org/apache/lucene/util/MSBRadixSorter.computeCommonPrefixLengthAndBuildHistogram bool excl> Jan 31 13:12:48 localhost.localdomain systemd-entrypoint[1767]: CompileCommand: exclude org/apache/lucene/util/RadixSelector.computeCommonPrefixLengthAndBuildHistogram bool exclu> Jan 31 13:12:48 localhost.localdomain systemd-entrypoint[1707]: Jan 31, 2024 1:12:48 PM sun.util.locale.provider.LocaleProviderAdapter <clinit> Jan 31 13:12:48 localhost.localdomain systemd-entrypoint[1707]: WARNING: COMPAT locale provider will be removed in a future release Jan 31 13:13:11 localhost.localdomain systemd[1]: Started elasticsearch.service - Elasticsearch.
此时使用浏览器访问9200端口则有:
此时可以看到,es服务已经启用,集群名称 myapp, 节点名称为:node1 以及一些其他信息
这里还有一个小问题需要注意,一般情况下,服务器都会有防火墙配置,如果没有修改防火墙配置,会出现明明服务已经启动但是就是无法访问的问题,为简单起见我这里是直接禁用了防火墙,实际生产环境则要对防火墙防护策略做出调整
systemctl stop firewalld
此时一个es单节点集群就已经能够正常使用了
es数据库单节点部署很简单对吧,其实多节点部署只是对配置文件进行调整,然后直接重启即可,这里的举例以8.12版本为主,在之前更早的版本中,有些配置已经被弃用,为了精简配置选项,很多步骤实现了自动化部署。
下面是调整之后的配置文件:
相较于单节点集群,多节点集群需要调整的配置主要为discovery.seed_hosts:
字段,需要添加相对应的集群中节点的地址,可以是ip加端口的形式,也可以是域名,url,等等,但要保证能通过这个地址正确访问到对应节点,默认端口9300
另外一个需要调整的就是cluster.initial_master_nodes:
字段,这里需要指定由哪些节点去竞争做主节点。ES数据库虽然是集群化部署,但也需要一个主节点去统一协调管理整个集群数据,在实际实践过程中,不可能让所有的节点都去竞争主节点,这样的话会影响其运行效率,该字段就是为了指定哪些节点去竞争主节点。需要说明的是,该配置只需要在第一次启动集群部署时需要配置,当集群主节点竞选结束之后,需要将该配置删除,不然会导致后续重启时出现不可预知的错误。
注:
- 这里这两个配置的书写方式较之前面发生了一些变化,这两个字段支持两种书写方式,一种是前面的[" ",‘’ "], 另一种就是这种换行的方式
- 在进行多节点部署时遇到了一个问题,就是当我最开始尝试将单节点扩展为双节点时,怎么都无法将两个节点关联起来,防火墙也检查了,甚至抓包看了一下双方的通讯消息,可以明确看到双方已经有了通讯,但是查询节点信息一直都是各自为政。经过一阵排查发现,在单节点部署时,cluster.initial_master_nodes 已经将本节点当作了主节点,然后再data目录下做了记录,当两个节点进行协商时,互相发现对方都是主节点,导致协商失败,删除path.data 目录下的数据,即可解决该问题。
# ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticsearch comes with reasonable defaults for most settings. # Before you set out to tweak and tune the configuration, make sure you # understand what are you trying to accomplish and the consequences. # # The primary way of configuring a node is via this file. This template lists # the most important settings you may want to configure for a production cluster. # # Please consult the documentation for further information on configuration options: # https://www.elastic.co/guide/en/elasticsearch/reference/index.html # # ---------------------------------- Cluster ----------------------------------- # # Use a descriptive name for your cluster: # cluster.name: myapp # # ------------------------------------ Node ------------------------------------ # # Use a descriptive name for the node: # node.name: node1 # # Add custom attributes to the node: # #node.attr.rack: r1 # # ----------------------------------- Paths ------------------------------------ # # Path to directory where to store the data (separate multiple locations by comma): # path.data: /var/lib/elasticsearch # # Path to log files: # path.logs: /var/log/elasticsearch # # ----------------------------------- Memory ----------------------------------- # # Lock the memory on startup: # bootstrap.memory_lock: false # # Make sure that the heap size is set to about half the memory available # on the system and that the owner of the process is allowed to use this # limit. # # Elasticsearch performs poorly when the system is swapping the memory. # # ---------------------------------- Network ----------------------------------- # # By default Elasticsearch is only accessible on localhost. Set a different # address here to expose this node on the network: # network.host: 172.16.20.73 # # By default Elasticsearch listens for HTTP traffic on the first free port it # finds starting at 9200. Set a specific HTTP port here: # http.port: 9200 # # For more information, consult the network module documentation. # # --------------------------------- Discovery ---------------------------------- # # Pass an initial list of hosts to perform discovery when this node is started: # The default list of hosts is ["127.0.0.1", "[::1]"] # discovery.seed_hosts: - 172.16.20.73:9300 - 172.16.20.74:9300 - 172.16.20.75:9300 - 172.16.20.76:9300 - 172.16.20.77:9300 # # Bootstrap the cluster using an initial set of master-eligible nodes: # #cluster.initial_master_nodes: ["node-1"] #discovery.type: single-node # # For more information, consult the discovery and cluster formation module documentation. # # ---------------------------------- Various ----------------------------------- # # Allow wildcard deletion of indices: # #action.destructive_requires_name: false #----------------------- BEGIN SECURITY AUTO CONFIGURATION ----------------------- # # The following settings, TLS certificates, and keys have been automatically # generated to configure Elasticsearch security features on 29-01-2024 02:35:42 # # -------------------------------------------------------------------------------- # Enable security features xpack.security.enabled: false xpack.security.enrollment.enabled: true # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents xpack.security.http.ssl: enabled: false keystore.path: certs/http.p12 # Enable encryption and mutual authentication between cluster nodes xpack.security.transport.ssl: enabled: false verification_mode: certificate keystore.path: certs/transport.p12 truststore.path: certs/transport.p12 # Create a new cluster with the current node only # Additional nodes can still join the cluster later #cluster.initial_master_nodes: # - node1 # - node2 cluster.initial_master_nodes: - node1 - node2 - node3 # Allow HTTP API connections from anywhere # Connections are encrypted and require user authentication http.host: 0.0.0.0 # Allow other nodes to join the cluster from anywhere # Connections are encrypted and mutually authenticated #transport.host: 0.0.0.0 #----------------------- END SECURITY AUTO CONFIGURATION -------------------------
多节点部署结果展示:
这里使用的图形化工具叫做elasticvue 一款开源的es查看检索工具,es官网也提供了一个kibana 工具,用起来比较复杂,这里贴个图
ElasticSearch 在7.x 以前的版本中,同时维护着三种不同的通讯协议,分别是基于HTTP的Elasticsearch REST APIs;基于tcp链接的client通讯协议,是使用java写的一个es客户端工具,7.x版本以后已经弃用,es官方一直推广的也是REST APIs,此通讯协议官方并没有给出对应文档,要想了解,只能去翻看客户端源码;基于tcp链接的节点间的通讯协议,用于集群内部之间的通讯,同样没有给出文档,只有翻看开源代码。
ElasticSearch 是使用java语言开发的一套基于lenece 检索工具的拥有强大检索能力的文档型数据库,其基本存储单元是json文档,又使用分词,分片等方法提高其对文档的检索能力,这里不对其实现细节与使用方法做详细解读,重点说明Elasticsearch REST APIs
elasticsearch 前后端通讯协议基于http协议实现,通过对外提供REST APIs 接口,用来实现对es数据库的各种操作
文档中明确说明请求正文中必须要求有content-type 类型,对于get 域head请求,不包含请求主体,因此在实践中常常不包含此部分内容,对于put以及post请求,则必须要求有content-type 字段。
es数据库是基于json设计的数据库,原则上只支持json结构文档,但实际使用过程中,其实也有yaml 等内容的消息类型,下面是一个yaml类型样例
为了帮助 REST 客户端减轻不兼容(破坏性)API 更改的影响,Elasticsearch 提供了按请求选择加入的 API 兼容性模式。
对于api的请求兼容,一般通过content-type 指定需要兼容的内容, 例如:
Accept: "application/vnd.elasticsearch+json;compatible-with=7"
Content-Type: "application/vnd.elasticsearch+json;compatible-with=7"
7.x-8.x 版本 一般支持的兼容性选型有如下四种
"application/vnd.elasticsearch+json;compatible-with=7"
"application/vnd.elasticsearch+yaml;compatible-with=7"
"application/vnd.elasticsearch+smile;compatible-with=7"
"application/vnd.elasticsearch+cbor;compatible-with=7"
添加一个json 文档到一个指定的索引,如果该指定文档已经存在,则会直接更新该文档。
请求消息如下:
PUT /<target>/_doc/<_id> POST /<target>/_doc/ PUT /<target>/_create/<_id> POST /<target>/_create/<_id> GET <index>/_doc/<_id> HEAD <index>/_doc/<_id> GET <index>/_source/<_id> HEAD <index>/_source/<_id> DELETE /<index>/_doc/<_id> POST /<target>/_delete_by_query POST /<index>/_update/<_id> POST /<target>/_update_by_query
7.9 以上的版本中引入了一个新的数据结构——数据流,具体数据流跟索引有什么区别,后面会详细说明。对于数据流,不能使用 put /doc/ 请求,对于指定的文档id应该使用 put //_create/
这里的put和post 方法在使用上是相同的。
在api后面可以添加参数,比如
PUT my-index-000001/_doc/1?timeout=5m
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
}
这个 PUT 请求在Elasticsearch中创建或更新一个具有特定ID的文档。
PUT: HTTP方法,用于创建或替换资源。
my-index-000001: 目标索引的名称,在这个索引中将创建或更新文档。
/_doc/1: 请求路径,/_doc 表示在Elasticsearch 7.x及更新版本中文档类型已被弃用,1 是文档的ID。
请求的URL包含查询参数:
?timeout=5m: 表示这个请求有一个5分钟的超时时间。如果请求在5分钟内没有完成,Elasticsearch将停止处理并返回一个超时错误。
请求的正文(body)包含JSON格式的数据:
此请求会将上面的JSON数据作为文档内容存储到索引 my-index-000001 中,文档的ID为 1。如果文档ID 1 已经存在于该索引中,它将被新提供的数据替换;如果不存在,将创建一个新文档。
GET /_mget
{
"docs": [
{
"_index": "my-index-000001",
"_id": "1"
},
{
"_index": "my-index-000001",
"_id": "2"
}
]
}
批处理操作
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
在Elasticsearch(ES)中,分词(Tokenization)是指将文本字段拆分成一系列的独立单词或词语的过程。这个过程是全文搜索的基础,因为它使得搜索引擎可以建立起一个索引,通过这个索引能够快速检索到包含特定词语的文档。
以下是对分词过程的几个要点:
1.分词器(Tokenizer)
:在ES中,分词器是执行分词过程的组件。它读取文本数据,然后以单词、短语或其他有意义的元素作为标记(Token)输出。分词器可以是简单的,如按空格分隔,也可以是复杂的,如支持多种语言、理解复合词等。
2.标记(Token)
:分词过程的输出单元,可以是一个单词、数字或符号。这些标记成为索引的一部分,搜索时将对其进行匹配。
3.分析器(Analyzer)
:ES中的分析器由分词器及其前后处理的过滤器(如小写化过滤器、停用词过滤器等)组成。分析器负责整体的处理流程,包括标准化(如转换为小写)、去除无关词(停用词)、词干提取等,以便建立更加有效和相关的搜索索引。
4.映射(Mapping)
:在ES中定义一个字段时,可以指定使用特定的分析器。这个定义过程称为映射,它决定了如何索引字段以及以后如何搜索字段。
举个例子,如果有一段文本“Quick brown fox”,在进行分词时,标准分析器可能会将其分成“quick”、“brown”和“fox”三个标记,并且转换成小写。这样,当用户搜索“Quick”或者“quick”时,都能找到这段文本,因为搜索是不区分大小写的,而且已经建立了对应的索引。
分词是全文检索中非常重要的一个环节,它直接影响到搜索结果的质量和搜索性能。在ES中,理解和合理配置分词器对于优化搜索体验至关重要。
Elasticsearch 既可以被视为一种数据库,也可以被视为一种搜索引擎,具体取决于它在系统中的应用场景。
作为搜索引擎,Elasticsearch 是专门设计用来处理复杂搜索查询的,特别是涉及全文搜索的场景。它的核心功能包括对数据进行索引和快速搜索,还有各种复杂查询的能力,如模糊搜索、近义词搜索、地理位置搜索等。它使用了倒排索引来高效地执行文本搜索。
作为数据库,Elasticsearch 能够存储和索引文档形式的数据(通常是 JSON 文档)。它具备一定的数据库特性,如数据持久化、能够处理CRUD操作(创建、读取、更新、删除),并且能够处理简单的数据聚合任务。
尽管 Elasticsearch 具备数据库的一些特性,但它在数据一致性、事务处理和多项其他传统关系型数据库功能方面并不那么强大。因此,Elasticsearch 通常与传统的数据库(如 MySQL、PostgreSQL)或非关系型数据库(如 MongoDB)结合使用,后者处理事务数据和复杂查询,而 Elasticsearch 用于支持高性能的文本搜索和数据分析。
总结来说,Elasticsearch 最常被视为一个强大的搜索引擎,但其也拥有存储和处理数据的数据库特性。
Elasticsearch 构建的是一个分布式的、去中心化的集群。在 Elasticsearch 集群中,每个节点都扮演着一定的角色,并与其他节点相互协作以确保整个集群的功能和性能。下面是 Elasticsearch 中节点之间的关系和角色划分:
1.主节点(Master Node)
:负责集群的管理和控制,例如创建或删除索引,追踪哪些节点是集群的一部分,以及决定哪些分片分配在哪个节点上。集群中有一个主节点活跃,但也有备选的主节点等待在必要时接管主节点角色。
2.数据节点(Data Node)
:存储数据,执行与数据相关的操作,如CRUD(创建、读取、更新、删除)、搜索和聚合。数据节点负责分片的存储和管理。
3.协调节点(Coordinating Node)
:接受客户端的请求,将这些请求路由到正确的数据节点,并将结果汇总返回给客户端。实际上,每个节点默认都具有协调节点的功能。
4.摄取节点(Ingest Node)
:对文档进行预处理,在文档被索引之前,执行一系列的处理流程。
5.专用节点(Dedicated Node)
:可以配置节点为专用的主节点或专用的数据节点。这意味着节点被配置为仅执行特定的任务,以优化性能和稳定性。
Elasticsearch 中的节点是通过网络连接并互相通信的,它们通过一个集中的状态管理来协调彼此的行动,这个状态包括了所有节点、索引、分片的当前状态。虽然存在主节点,但 Elasticsearch 的设计是去中心化的,因为每个节点都能够处理请求,主节点的职责主要是集群级别的管理。
节点可以动态加入或离开集群,主节点会重新分配分片来平衡集群。如果主节点失败,集群会自动选举一个新的主节点。这种设计使得 Elasticsearch 能够很好地处理节点故障,从而提供高可用性和扩展性。
在部署 Elasticsearch 时,应仔细规划节点的角色和数量,以满足性能、数据冗余和容错的需求。
Elasticsearch确实使用HTTP REST接口进行通信,这意味着你可以使用标准的HTTP方法(GET、POST、PUT、DELETE)来进行不同类型的操作。下面是各种操作和相应HTTP方法的一些基本用例:
GET
用于检索信息,包括:
DSL(Domain Specific Language)是一种特定于领域的语言,Elasticsearch DSL是一种用于构建Elasticsearch查询的JSON风格的领域特定语言。它允许你以声明的方式指定要执行的搜索,排序,过滤等操作。在Elasticsearch中,这种DSL用于构建强大的搜索能力,以及其他如聚合和过滤的功能。
Elasticsearch的DSL基于JSON,具有以下基本组件:
查询(Query)和过滤(Filter)
{
"query": {
"match": {
"field_name": "search_value"
}
}
}
基本布尔查询示例
以下是一个结合了多个条件的bool查询示例,它使用must、must_not、should和filter子句来定义逻辑关系:
{ "query": { "bool": { "must": [ { "match": { "field1": "value1" } } ], "must_not": [ { "match": { "field2": "value2" } } ], "should": [ { "match": { "field3": "value3" } } ], "filter": [ { "term": { "field4": "value4" } } ] } } }
在这个例子中:
{ "size": 0, "aggs": { "popular_tags": { "terms": { "field": "tags.keyword" }, "aggs": { "max_likes": { "max": { "field": "likes" } } } } } }
在这个例子中,我们首先对"tags"字段进行分组,并在每个分组内寻找最大的"likes"值。
Elasticsearch的DSL非常灵活和强大,可以构建从简单到非常复杂的查询。在实践中,构建这些查询通常需要对你的数据模式和特定的用例有深入的了解。由于JSON结构的层次性和组合性,DSL能够表达非常复杂的逻辑。
在Elasticsearch中,数据流(Data Streams)和索引(Indices)是两种不同的数据结构,它们各自有不同的用途和优化场景。
索引(Indices):
一个索引是Elasticsearch中的基础数据结构,它是具有相似特征的文档集合。每个文档都是一个包含了数据的JSON对象,这些文档可以被搜索和检索。一个索引包含了倒排索引、存储字段、映射(定义字段名称和数据类型)等组件,允许用户快速地执行全文搜索、精确值搜索、过滤等操作。
索引是多功能的,适合各种用途,但在管理大量数据时,尤其是时序数据(如日志或指标),可能会有一些挑战,比如数据生命周期管理、性能优化等。
数据流(Data Streams):
数据流是Elasticsearch 7.9及以上版本中引入的一个特性,它专门为追加只读的时序数据而设计。数据流背后实际上是一系列索引,这些索引按时间顺序组织,并以一种隐藏的方式对用户提供数据操作的接口。
当你向数据流写入数据时,Elasticsearch会自动将数据写入到正确的后备索引中。每个后备索引都代表数据流中的一个数据段,称为一个索引生命周期的“生成”(generation)。随着时间的推移,数据会被追加到新的后备索引中,旧的后备索引最终会被冻结(只读)并且根据生命周期策略可能会被删除。
数据流的主要优势如下:
易于管理: 数据流使得时序数据的管理变得更加容易。你不需要手动管理多个索引和别名,数据流自动处理这些。
自动分片: 数据流自动根据时间或其他条件创建新的后备索引,并管理这些索引之间的关系。
生命周期管理: 与索引生命周期管理(ILM)策略集成,可以自动执行如滚动、冻结、删除等任务。
优化写入性能: 数据流优化了追加写入的性能,因为每次写入都是追加到最新的后备索引,这对于时序数据来说非常高效。
应用场景方面,如果你主要处理的是日志、指标或其他形式的时序数据,并且希望系统能够自动管理数据的生命周期和索引的创建,那么使用数据流可能更合适。如果你的应用场景不是严格意义上的时序数据,或者需要更灵活的数据管理,你可能会选择使用传统的索引。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。