折腾 Quickwit,Rust 编写的分布式搜索引擎-官方配置详解

Node configuration(节点配置)

节点配置允许您为集群中的各个节点自定义和优化设置。它被分为几个部分:

一个带注释的例子可在此处找到:quickwit.yaml

Common configuration(常规配置)

属性 描述 环境变量 默认值
version 配置文件版本。0.7 是唯一可用的值,并且与 0.50.4 版本向后兼容。
cluster_id 节点将加入的集群的唯一标识符。共享同一网络的集群应使用不同的集群ID。 QW_CLUSTER_ID quickwit-default-cluster
node_id 节点的唯一标识符。它必须与集群中其他节点的标识符不同。如果未设置,则默认为实例的短主机名。 QW_NODE_ID 短主机名
enabled_services 已启用的服务(控制平面、索引器、清理程序、元存储、搜索器) QW_ENABLED_SERVICES 所有服务
listen_address Quickwit 服务绑定的 IP 地址或主机名,用于启动 REST 和 gRPC 服务器以及连接此节点到其他节点。默认情况下,Quickwit 绑定到 127.0.0.1(本地主机)。当尝试形成集群时,此默认值无效。 QW_LISTEN_ADDRESS 127.0.0.1
advertise_address 节点广播的 IP 地址,即对等节点用于连接到该节点进行远程过程调用的 IP 地址。 QW_ADVERTISE_ADDRESS listen_address
gossip_listen_port 监听 Gossip 集群成员服务(UDP)的端口。 QW_GOSSIP_LISTEN_PORT rest.listen_port
grpc_listen_port gRPC 服务监听流量的端口。 QW_GRPC_LISTEN_PORT rest.listen_port + 1
peer_seeds 用于引导集群并发现完整节点集的 IP 地址或主机名列表。此列表可以包含当前节点的地址,并不需要详尽无遗。如果 peer_seeds 列表中包含主机名,Quickwit 将通过每分钟查询 DNS 来解析它。例如,在 Kubernetes 中,最好将其设置为 无头服务 QW_PEER_SEEDS
data_dir 用于持久化数据(临时数据、用于缓存目的的切片)的目录路径。这主要用于索引操作。 QW_DATA_DIR ./qwdata
metastore_uri 元存储 URI。可以是本地目录或 s3://my-bucket/indexespostgres://username:password@localhost:5432/metastore了解更多关于元存储配置的信息 QW_METASTORE_URI {data_dir}/indexes
default_index_root_uri 定义存储索引数据(切片)位置的默认索引根 URI。索引 URI 的构建遵循以下模式:{default_index_root_uri}/{index-id} QW_DEFAULT_INDEX_ROOT_URI {data_dir}/indexes
仅环境变量 Quickwit 的日志级别。可以是直接的日志级别,或者是由逗号分隔的 module_name=level 列表。 RUST_LOG info

REST configuration(REST 配置)

此部分包含 REST API 的配置选项。

属性 描述 环境变量 默认值
listen_port REST API 监听 HTTP 流量的端口。 QW_REST_LISTEN_PORT 7280
cors_allow_origins 配置允许访问 API 的 CORS 来源。了解更多
extra_headers 头名称和值的列表
Configuring CORS (配置跨源资源共享)

CORS(跨源资源共享)描述了哪些地址或来源可以从浏览器访问 REST API。

默认情况下,不允许跨源共享资源。

可以在 cors_allow_origins 参数中指定通配符、单一来源或多个来源:

REST 配置示例:

yaml 复制代码
rest:
  listen_port: 1789
  extra_headers:
    x-header-1: header-value-1
    x-header-2: header-value-2
  cors_allow_origins: '*'

#   cors_allow_origins: https://my-hdfs-logs.domain.com   # Optionally we can specify one domain
#   cors_allow_origins:                                   # Or allow multiple origins
#     - https://my-hdfs-logs.domain.com
#     - https://my-hdfs.other-domain.com

gRPC configuration(gRPC 配置)

此部分包含用于节点间内部通信的 gRPC 服务和客户端的配置选项。

属性 描述 环境变量 默认值
max_message_size 内部 gRPC 客户端和服务之间交换的消息的最大大小(字节)。 20 MiB

gRPC 配置示例:

yaml 复制代码
grpc:
  max_message_size: 30 MiB

我们建议只有在遇到以下错误时才更改 20 MiB 的默认值:Error, message length too large: found 24732228 bytes, the limit is: 20971520 bytes.(错误,消息长度过大:找到 24732228 字节,限制是:20971520 字节。) 在这种情况下,请逐步增加 max_message_size,每次增加 10 MiB,直到问题消失。这是一个临时解决方案:Quickwit 的下一个版本 0.8 将完全依赖于 gRPC 流式传输端点,并能处理任意长度的消息。

Storage configuration(存储配置)

请参阅专门的 存储配置 页面,了解如何为各种存储提供商配置 Quickwit 的更多信息。

这里还有一些如何使用 Amazon S3 或 Alibaba OSS 配置 Quickwit 的最小示例:

bash 复制代码
AWS_ACCESS_KEY_ID=<your access key ID>
AWS_SECRET_ACCESS_KEY=<your secret access key>

Amazon S3

yaml 复制代码
storage:
  s3:
    region: us-east-1

Alibaba

yaml 复制代码
storage:
  s3:
    region: us-east-1
    endpoint: https://oss-us-east-1.aliyuncs.com

Metastore configuration(元存储配置)

此部分可能包含每个可用元存储实现的一个配置子部分。每个实现的具体配置参数可能会有所不同。目前可用的元存储实现包括:

  • File-backed
  • PostgreSQL
File-backed metastore configuration(文件型元存储配置)

文件支持型元存储没有节点级别的配置。您可以在 索引级别 配置轮询间隔。

PostgreSQL metastore configuration(PostgreSQL 元存储配置)
属性 描述 默认值
min_connections 池中始终维护的最小连接数。 0
max_connections 池中维护的最大连接数。 10
acquire_connection_timeout 在放弃查询之前等待可用连接的最大时间。 10s
idle_connection_timeout 关闭单个连接前的最大空闲持续时间。 10min
max_connection_lifetime 单个连接的最大生命周期。 30min

PostgreSQL 元存储配置的 YAML 格式示例:

yaml 复制代码
metastore:
  postgres:
    min_connections: 10
    max_connections: 50
    acquire_connection_timeout: 30s
    idle_connection_timeout: 1h
    max_connection_lifetime: 1d

Indexer configuration(索引器配置)

此部分包含索引器的配置选项。分片存储在 索引文档 中有详细说明。

属性 描述 默认值
split_store_max_num_bytes 分片存储中允许的最大字节数。 100G
split_store_max_num_splits 分片存储中允许的最大文件数。 1000
max_concurrent_split_uploads 节点上允许的最大并发分片上传数。 12
merge_concurrency 节点上可以同时执行的最大合并操作数。 (2 x 可用线程数) / 3
enable_otlp_endpoint 如果为真,则启用通过 OpenTelemetry 协议 (OTLP) 接收日志和跟踪的 OpenTelemetry 导出端点。 false
cpu_capacity 控制平面使用的咨询参数。值可以用线程表示(例如 2),也可以用 millicpus 表示(例如 2000m)。控制平面将尝试根据索引器声明的 CPU 容量,在不同节点上按比例调度索引管道。它不是作为限制使用。无论集群是否有足够的容量,所有管道都将被调度。当负载远低于 cpu_capacity 时,控制平面不会试图平均分配工作。需要在所有索引器节点上均衡负载的用户可以将 cpu_capacity 设置为一个任意低的值,只要它与可用线程数成比例即可。 可用线程数

示例:

yaml 复制代码
indexer:
  split_store_max_num_bytes: 100G
  split_store_max_num_splits: 1000
  max_concurrent_split_uploads: 12
  enable_otlp_endpoint: true

Ingest API configuration(Ingest API 配置)

属性 描述 默认值
max_queue_memory_usage Ingest 队列在内存中的最大大小(字节)。 2GiB
max_queue_disk_usage Ingest 队列占用的最大磁盘空间(字节)。最小大小至少为 256M 并且至少为 max_queue_memory_usage 4GiB

示例:

yaml 复制代码
ingest_api:
  max_queue_memory_usage: 2GiB
  max_queue_disk_usage: 4GiB

Searcher configuration(搜索器配置)

此部分包含搜索器的配置选项。

属性 描述 默认值
aggregation_memory_limit 控制聚合阶段前可以使用的最大内存量。此限制适用于每个请求和单个叶查询(叶查询是指并发查询一个或多个分片)。它用于防止聚合阶段中过度使用内存,这可能导致性能下降或崩溃。由于它是针对每个请求的,因此并发请求可能会超过此限制。 500M
aggregation_bucket_limit 确定返回给客户端的最大桶数。 65000
fast_field_cache_capacity 搜索器上的快速字段内存缓存容量。如果您按日期过滤、运行聚合、范围查询,或者使用搜索流 API,甚至进行追踪,可能值得增加此参数。以 quickwit_cache_fastfields_cache 开头的 指标 可帮助您在设置此值时做出明智的选择。 1G
split_footer_cache_capacity 搜索器上的分片尾部内存缓存容量(本质上是热缓存)。 500M
partial_request_cache_capacity 搜索器上的部分请求内存缓存容量。为请求缓存中间状态,可能使后续请求更快。可以通过将其大小设置为 0 来禁用它。 64M
max_num_concurrent_split_searches 在搜索器上运行的最大并发分片搜索请求数。 100
max_num_concurrent_split_streams 在搜索器上运行的最大并发分片流请求数。 100
split_cache 下面定义的搜索器分片缓存配置选项。如果未指定,则禁用缓存。
Searcher split cache configuration(搜索器分片缓存配置)

此部分包含磁盘上搜索器分片缓存的配置选项。

属性 描述 默认值
max_num_bytes 分片缓存中允许的最大磁盘大小(字节)。可能会被单个分片的大小超过。
max_num_splits 分片缓存中允许的最大分片数。 10000
num_concurrent_downloads 最大并发下载分片数。 1

示例:

yaml 复制代码
searcher:
  fast_field_cache_capacity: 1G
  split_footer_cache_capacity: 500M
  partial_request_cache_capacity: 64M
  split_cache:
    max_num_bytes: 1G
    max_num_splits: 10000
    num_concurrent_downloads: 1

Jaeger configuration(Jaeger 配置)

属性 描述 默认值
enable_endpoint 如果为真,则启用允许 Jaeger 查询服务连接并检索跟踪的 gRPC 端点。 false

示例:

yaml 复制代码
searcher:
  enable_endpoint: true

Using environment variables in the configuration(在配置中使用环境变量)

您可以在配置文件中使用环境变量引用,以设置在部署期间需要可配置的值。为此,请使用:

${VAR_NAME}

其中 VAR_NAME 是环境变量的名称。

每个变量引用在启动时都会被环境变量的值替换。替换过程区分大小写,并且在解析配置文件之前发生。除非您指定了默认值或自定义错误文本,否则引用未定义的变量会抛出错误。

为了指定默认值,请使用:

${VAR_NAME:-default_value}

其中 default_value 是如果环境变量未设置时要使用的值。

<config_field>: ${VAR_NAME}
or
<config_field>: ${VAR_NAME:-default value}

例如:

bash 复制代码
export QW_LISTEN_ADDRESS=0.0.0.0
yaml 复制代码
# config.yaml
version: 0.7
cluster_id: quickwit-cluster
node_id: my-unique-node-id
listen_address: ${QW_LISTEN_ADDRESS}
rest:
  listen_port: ${QW_LISTEN_PORT:-1111}

将被 Quickwit 理解为:

yaml 复制代码
version: 0.7
cluster_id: quickwit-cluster
node_id: my-unique-node-id
listen_address: 0.0.0.0
rest:
  listen_port: 1111

Storage configuration(存储配置)

Supported Storage Providers(支持的存储提供商)

Quickwit 目前支持四种类型的存储提供商:

  • Amazon S3 和 S3 兼容(Garage、MinIO 等)
  • Azure Blob 存储
  • 本地文件存储*
  • Google Cloud Storage(原生 API)

Storage URIs(存储 URI)

存储 URI 通过 URI "协议" 或 "方案" 来标识不同的存储提供商。Quickwit 支持以下存储 URI 协议:

  • s3:// 用于 Amazon S3 和 S3 兼容
  • azure:// 用于 Azure Blob 存储
  • file:// 用于本地文件系统
  • gs:// 用于 Google Cloud Storage

通常情况下,您可以在任何直观地期望文件路径的地方使用存储 URI 或文件路径。例如:

  • 设置索引的 index_uri 以指定存储提供商和位置;
  • 在节点配置中设置 metastore_uri 以建立基于文件的元数据存储;
  • 作为命令行参数传递文件路径。
Local file storage URIs(本地文件存储 URI)

Quickwit 将常规文件路径解释为本地文件系统 URI。允许使用相对文件路径,并且它们相对于当前工作目录(CWD)进行解析。可以使用 ~ 作为快捷方式来引用用户的主目录。以下是有效的本地文件系统 URI:

markdown 复制代码
- /var/quickwit
- file:///var/quickwit
- /home/quickwit/data
- ~/data
- ./quickwit

当使用 file:// 协议时,需要第三个 / 来表示绝对路径。例如,URI file://home/quickwit/ 被解释为 ./home/quickwit

Storage configuration(存储配置)

此部分包含针对每个存储提供商的一个配置子部分。如果未显式设置存储配置参数,则 Quickwit 依赖于存储提供商 SDK(Azure SDK for RustAWS SDK for Rust)提供的默认值。

S3 storage configuration(S3 存储配置)
属性 描述 默认值
flavor 可选的存储风味。可用的风味包括 digital_oceangaragegcsminio
access_key_id AWS 访问密钥 ID。
secret_access_key AWS 密钥访问密钥。
region 发送请求的 AWS 区域。 us-east-1(SDK 默认值)
endpoint 与 S3 兼容提供商一起使用的自定义端点。 SDK 默认值
force_path_style_access 禁用 虚拟主机风格请求。某些 S3 兼容提供商(Ceph、MinIO)要求使用。 false
disable_multi_object_delete 禁用 多对象删除请求。某些 S3 兼容提供商(GCS)要求使用。 false
disable_multipart_upload 禁用 多部分上传对象。某些 S3 兼容提供商(GCS)要求使用。 false

将凭证硬编码到配置文件中是不安全的,强烈不建议这样做。优先考虑您的存储后端可能提供的替代认证方法。

Environment variables(环境变量)
环境变量 描述
QW_S3_ENDPOINT 自定义 S3 端点。
QW_S3_MAX_CONCURRENCY 限制对 S3 的并发请求数量。
Storage flavors(存储风味)

Storage flavors 确保 Quickwit 通过自动配置适当的设置与偏离 S3 API 的存储提供商正确工作。可用的风味包括:

  • digital_ocean
  • garage
  • gcs
  • minio

Digital Ocean

Digital Ocean flavor (digital_ocean) 强制使用路径风格访问,并关闭多对象删除请求。

Garage flavor

Garage flavor (garage) 覆盖 region 参数为 garage 并强制使用路径风格访问。

Google Cloud Storage

Google Cloud Storage flavor (gcs) 关闭多对象删除请求和多部分上传。

MinIO flavor

MinIO flavor (minio) 强制使用路径风格访问。

Google Cloud Storage 的存储配置 YAML 格式示例:

yaml 复制代码
storage:
  s3:
    flavor: gcs
    region: us-east1
    endpoint: https://storage.googleapis.com
Azure storage configuration(Azure 存储配置)
属性 描述 默认值
account Azure 存储账户名称。
access_key Azure 存储账户访问密钥。
Environment variables(环境变量)
环境变量 描述
QW_AZURE_STORAGE_ACCOUNT Azure Blob 存储账户名称。
QW_AZURE_STORAGE_ACCESS_KEY Azure Blob 存储账户访问密钥。

Azure 的存储配置 YAML 格式示例:

yaml 复制代码
storage:
  azure:
    account: your-azure-account-name
    access_key: your-azure-access-key

Storage configuration examples for various object storage providers(各种对象存储提供商的存储配置示例)

Garage

Garage 是一个为自托管定制的开源分布式对象存储服务。

yaml 复制代码
storage:
  s3:
    flavor: garage
    endpoint: http://127.0.0.1:3900
MinIO

MinIO 是一种高性能的对象存储。

yaml 复制代码
storage:
  s3:
    flavor: minio
    endpoint: http://127.0.0.1:9000

注意:default_index_root_uri 或索引 URI 不包含端点,您应该将其设置为典型的 S3 路径,如 s3://indexes

Index configuration(索引配置)

本页面描述了如何配置一个索引。

除了 index_id 外,索引配置还允许您定义五个项目:

  • index-uri:它定义了索引文件应存储的位置。
  • 文档映射:它定义了一个文档及其包含的字段如何为给定索引存储和索引。
  • 索引设置:它定义了用于分片的时间戳字段,以及一些更高级的参数,如合并策略。
  • 搜索设置 :它定义了默认搜索字段 default_search_fields,即如果用户查询没有明确指定字段时 Quickwit 将搜索的字段列表。
  • 保留策略:它定义了 Quickwit 应保留已索引数据的时间长度。如果不指定,则数据将永久存储。

配置是在创建索引时设置的,并且可以使用 更新端点CLI 进行更改。

Config file format(配置文件格式)

索引配置格式为 YAML。当配置文件中缺少某个键时,将使用默认值。

下面是一个适用于 HDFS 日志数据集的完整示例:

yaml 复制代码
version: 0.7 # File format version.

index_id: "hdfs"

index_uri: "s3://my-bucket/hdfs"

doc_mapping:
  mode: lenient
  field_mappings:
    - name: timestamp
      type: datetime
      input_formats:
        - unix_timestamp
      output_format: unix_timestamp_secs
      fast_precision: seconds
      fast: true
    - name: severity_text
      type: text
      tokenizer: raw
      fast:
        - tokenizer: lowercase
    - name: body
      type: text
      tokenizer: default
      record: position
    - name: resource
      type: object
      field_mappings:
        - name: service
          type: text
          tokenizer: raw
  tag_fields: ["resource.service"]
  timestamp_field: timestamp
  index_field_presence: true

search_settings:
  default_search_fields: [severity_text, body]

retention:
  period: 90 days
  schedule: daily

Index ID(索引 ID)

索引 ID 是一个字符串,用于在元存储中唯一标识索引。它只能包含大写或小写的 ASCII 字母、数字、破折号 (-) 和下划线 (_)。最后,它必须以字母开头,并且至少包含 3 个字符但不超过 255 个字符。

Index uri(索引 URI)

索引 URI 定义了索引文件(也称为切片)应存储的位置。

此参数期望一个 存储 URI

index-uri 参数是可选的。

默认情况下,index-uri 会通过将 index-idQuickwit 的配置 中定义的 default_index_root_uri 连接起来计算得出。

在分布式模式下运行 Quickwit 时,文件存储将无法工作。相反,在运行多个搜索节点时,应使用 AWS S3、Azure Blob 存储、Google Cloud Storage(在 S3 互操作模式下)或其他 S3 兼容的存储系统,如 Scaleway Object Storage 和 Garage 作为存储。

Doc mapping(文档映射)

文档映射定义了如何为给定索引存储和索引文档及其包含的字段。文档是一组命名字段的集合,每个字段都有自己的数据类型(文本、字节、日期时间、布尔、i64、u64、f64、IP、JSON)。

变量 描述 默认值
field_mappings 字段映射的集合,每个映射都有其自己的数据类型(文本、二进制、日期时间、布尔、i64、u64、f64、IP、JSON)。 []
mode 定义了 Quickwit 如何处理不在 field_mappings 中的文档字段。特别是,"动态"模式使得可以在无模式的方式下使用 Quickwit。(参见 mode) dynamic
dynamic_mapping mode 设置为 dynamic 时才允许此参数。然后它定义了是否应该对动态映射的字段进行索引、存储等。 (参见 mode)
tag_fields 已经在 field_mappings 中定义的字段集合*,这些字段的值将作为 tags 元数据的一部分存储。了解更多关于标签的信息 []
store_source 原始 JSON 文档是否存储在索引中。 false
timestamp_field 用于将文档分片的日期时间字段*。该字段必须是 datetime 类型。了解更多关于时间分片的信息 None
partition_key 如果设置,Quickwit 将根据声明为 partition_key 的字段名称将文档路由到不同的切片中。 null
max_num_partitions 限制通过分区创建的切片数量。(参见 分区) 200
index_field_presence 对快速字段自动启用 exists 查询。为了对所有其他字段启用它,请将此参数设置为 true。启用它可能会在索引时产生显著的 CPU 开销。 false

*: 标签字段和时间戳字段表示为从 JSON 对象根到给定字段的路径。如果字段名称包含一个 . 字符,则需要用 \ 字符转义。

Field types(字段类型)

每个字段[^1]都有一个类型,指示它包含的数据种类,例如 64 位整数或文本。

Quickwit 支持以下原始类型:texti64u64f64datetimeboolipbytesjson,同时也支持复合类型,如数组和对象。在幕后,Quickwit 使用 tantivy 字段类型,如果您想深入了解细节,请参阅 tantivy 文档

Raw types(原始类型)
Text type(文本类型)

此字段是一个文本字段,在索引之前会被分析并拆分成令牌。

这种类型的字段适合全文搜索。

文本字段映射示例:

文本字段参数

变量 描述 默认值
description 字段的可选描述。 None
stored 值是否存储在文档存储中。 true
indexed 值是否应该被索引以便能够进行搜索。 true
tokenizer Tokenizer 的名称。(查看分词器)以获取可用分词器的列表。 default
record 描述索引的信息量,可以选择 basicfreqposition basic
fieldnorms 是否为字段存储字段规范。字段规范用于计算文档的 BM25 分数。 false
fast 值是否存储在快速字段中。快速字段将包含术语 ID 和字典。对于 true 的默认行为是不变地存储原始文本。快速字段上的规范化器单独配置。可以通过 normalizer: lowercase 来配置。(查看规范化器)以获取可用规范化器的列表。 false

可用分词器的描述

分词器 描述
raw 不处理也不分词文本。过滤掉大于 255 字节的令牌。
raw_lowercase 不分词文本,但将其转换为小写。过滤掉大于 255 字节的令牌。
default 根据空白字符和标点符号分割文本,移除过长的令牌,并转换为小写。过滤掉大于 255 字节的令牌。
en_stem 类似于 default,但在结果令牌上还应用了词干提取。过滤掉大于 255 字节的令牌。
whitespace 仅根据空白字符分割文本。不移除长令牌也不转换为小写。
chinese_compatible 除了 default 执行的操作之外,还在每个 CJK 字符之间进行分割。应与 record: position 一起使用以正确地进行搜索。
lowercase 对文本应用小写转换。它不分词文本。

可用规范化器的描述

规范化器 描述
raw 不处理也不分词文本。过滤掉大于 255 字节的令牌。
lowercase 对文本应用小写转换。过滤掉大于 255 字节的令牌。

记录选项的描述

记录选项 描述
basic 仅记录 DocId
freq 记录文档 ID 以及术语频率
position 记录文档 ID、术语频率以及出现位置。

使用位置索引是执行短语查询所必需的。

Numeric types: i64, u64 and f64 type(数值类型:i64u64f64 类型)

Quickwit 支持三种数值类型:i64u64f64

数值值可以存储在快速字段中(相当于 Lucene 的 DocValues),这是一种用于范围查询和聚合的列式存储。

在未指定字段的情况下查询负数(使用 default_search_fields),您应该单引号括起数字(例如 -5),否则它将被解释为匹配除了该数字以外的任何内容。

u64 字段映射示例:

yaml 复制代码
name: rating
description: Score between 0 and 5
type: u64
stored: true
indexed: true
fast: true

数值类型字段 (i64, u64, 和 f64) 参数

变量 描述 默认值
description 字段的可选描述。 None
stored 字段值是否存储在文档存储中。 true
indexed 字段值是否被索引。 true
fast 字段值是否存储在快速字段中。 false
coerce 是否将作为字符串传递的数字转换为整数或浮点数。 true
output_format 用于返回搜索结果中数字的 JSON 类型。可能的值为 numberstring number
datetime type(日期时间类型)

datetime 类型处理日期和日期时间。由于 JSON 没有日期类型,datetime 字段支持多种输入类型和格式。支持的输入类型包括:

  • 表示 Unix 时间戳的浮点数或整数
  • 包含格式化的日期、日期时间或 Unix 时间戳的字符串

input_formats 字段参数指定了接受的日期格式。以下输入格式得到原生支持:

  • iso8601
  • rfc2822
  • rfc3339
  • strptime
  • unix_timestamp

输入格式

当指定多个输入格式时,相应的解析器会按照声明的顺序尝试。以下格式得到原生支持:

  • iso8601, rfc2822, rfc3339:使用标准的 ISO 和 RFC 格式解析日期。
  • strptime:使用 Unix strptime 格式解析日期,有一些变化:
    • strptime 格式标识符:%C, %d, %D, %e, %F, %g, %G, %h, %H, %I, %j, %k, %l, %m, %M, %n, %R, %S, %t, %T, %u, %U, %V, %w, %W, %y, %Y, %%
    • %f 用于毫秒精度支持。
    • %z 时区偏移可以指定为 (+|-)hhmm(+|-)hh:mm

目前不支持时区名称格式标识符 (%Z)。https://man7.org/linux/man-pages/man3/strptime.3.html

  • unix_timestamp:解析浮点数和整数为 Unix 时间戳。浮点值转换为以秒表示的时间戳。整数值转换为 Unix 时间戳,其精度(秒、毫秒、微秒或纳秒)根据输入数字位数推断。内部地,日期时间转换为 UTC(如果指定了时区),并存储为 i64 整数。因此,Quickwit 只支持从 Apr 13, 1972 23:59:55Mar 16, 2242 12:56:31 的时间戳值。

从浮点数到整数值的转换可能会导致精度损失。

datetime 字段存储为快速字段时,fast_precision 参数指示在编码前用于截断值的精度,这有助于压缩(此处的截断意味着清零)。fast_precision 参数可以取以下值:seconds, milliseconds, microseconds, 或 nanoseconds。它只影响标记为"快速"的 datetime 字段在快速字段中存储的内容。最后,对 datetime 快速字段的操作,例如通过聚合,需要在纳秒级别进行。

内部地,`datetime` 在快速字段和文档存储中以 `nanoseconds` 存储,在术语字典中以 `seconds` 存储。

此外,Quickwit 支持 output_format 字段参数来指定以何种精度反序列化日期时间。此参数支持与输入格式相同的值,除了 unix_timestamp 被替换为以下格式:

  • unix_timestamp_secs:以秒显示时间戳。
  • unix_timestamp_millis:以毫秒显示时间戳。
  • unix_timestamp_micros:以微秒显示时间戳。
  • unix_timestamp_nanos:以纳秒显示时间戳。

datetime 字段映射示例:

yaml 复制代码
name: timestamp
type: datetime
description: Time at which the event was emitted
input_formats:
  - rfc3339
  - unix_timestamp
  - "%Y %m %d %H:%M:%S.%f %z"
output_format: unix_timestamp_secs
stored: true
indexed: true
fast: true
fast_precision: milliseconds

日期时间字段参数

变量 描述 默认值
input_formats 用于解析输入日期的格式 [rfc3339, unix_timestamp]
output_format 用于在搜索结果中显示日期的格式 rfc3339
stored 字段值是否存储在文档存储中 true
indexed 字段值是否被索引 true
fast 字段值是否存储在快速字段中 false
fast_precision 用于存储快速值的精度 (seconds, milliseconds, microseconds, 或 nanoseconds) seconds
bool type(布尔类型)

bool 类型接受布尔值。

布尔字段映射示例:

yaml 复制代码
name: is_active
description: Activation status
type: bool
stored: true
indexed: true
fast: true

布尔字段参数

变量 描述 默认值
description 字段的可选描述。 None
stored 值是否存储在文档存储中 true
indexed 值是否被索引 true
fast 值是否存储在快速字段中 false
ip type(IP 类型)

ip 类型接受 IP 地址值,同时支持 IPv4 和 IPv6。内部地,IPv4 地址会被转换为 IPv6。

IP 字段映射示例:

yaml 复制代码
name: host_ip
description: Host IP address
type: ip
fast: true

IP 字段参数

变量 描述 默认值
description 字段的可选描述。 None
stored 值是否存储在文档存储中 true
indexed 值是否被索引 true
fast 值是否存储在快速字段中 false
bytes type(二进制类型)

bytes 类型接受一个以 Base64 编码的字符串形式的二进制值。

二进制字段映射示例:

yaml 复制代码
name: binary
type: bytes
stored: true
indexed: true
fast: true
input_format: hex
output_format: hex

二进制字段参数

变量 描述 默认值
description 字段的可选描述。 None
stored 值是否存储在文档存储中 true
indexed 值是否被索引 true
fast 值是否存储在快速字段中。仅支持一对一基数,不支持 array<bytes> 字段 false
input_format 用于表示输入二进制数据的编码,可以是 hexbase64 base64
output_format 用于在搜索结果中表示二进制数据的编码,可以是 hexbase64 base64
json type(JSON 类型)

json 类型接受一个 JSON 对象。

JSON 字段映射示例:

yaml 复制代码
name: parameters
type: json
stored: true
indexed: true
tokenizer: raw
expand_dots: false
fast:
  normalizer: lowercase

JSON 字段参数

变量 描述 默认值
description 字段的可选描述。 None
stored 值是否存储在文档存储中 true
indexed 值是否被索引 true
fast 值是否存储在快速字段中。JSON 中文本的默认行为是不变地存储文本。可以通过 normalizer: lowercase 配置一个标准化器。(查看可用的标准化器) 以获取可用标准化器列表。 true
tokenizer 仅影响 JSON 对象中的字符串Tokenizer 的名称,可以选择 raw, default, en_stemchinese_compatible raw
record 仅影响 JSON 对象中的字符串 。描述索引的信息量,可以选择 basic, freqposition basic
expand_dots 如果为真,则包含 . 的 JSON 键将被展开。例如,如果 expand_dots 设置为真,则 {"k8s.node.id": "node-2"} 将像 {"k8s": {"node": {"id": "node2"}}} 一样被索引。这样做的好处是在查询时不需要转义 .。换句话说,k8s.node.id:node2 将匹配文档。这不会影响文档的存储方式。 true

注意 tokenizerrecord 与文本字段具有相同的定义和相同的效果。

要在 JSON 对象中搜索,则需要扩展字段名以指向目标值的路径。

例如,当索引以下对象时:

json 复制代码
{
    "product_name": "droopy t-shirt",
    "attributes": {
        "color": ["red", "green", "white"],
        "size:": "L"
    }
}

假设 attributes 已经被定义为如下字段映射:

yaml 复制代码
- type: json
  name: attributes

attributes.color:red 是一个有效的查询。

如果另外将 attributes 设置为默认搜索字段,那么 color:red 也是一个有效的查询。

Composite types(复合类型)
array(数组)

Quickwit 支持所有原始类型(除了 object 类型)的数组。

要在索引配置中声明一个 i64 类型的数组,只需将类型设置为 array<i64> 即可。

object(对象)

Quickwit 支持嵌套对象,只要它不包含对象数组即可。

yaml 复制代码
name: resource
type: object
field_mappings:
  - name: service
    type: text
concatenate(拼接)

Quickwit 支持将多个字段的内容映射到单一字段上。这在查询时可能比遍历数十个 default_search_fields 更高效。它还允许在不知道要搜索字段的路径的情况下,在 JSON 字段内进行查询。

yaml 复制代码
name: my_default_field
type: concatenate
concatenated_fields:
  - text # things inside text, tokenized with the `default` tokenizer
  - resource.author # all fields in resource.author, assuming resource is an `object` field.
include_dynamic_fields: true
tokenizer: default
record: basic

拼接字段不支持快速字段,并且永远不会存储。它们使用自己的分词器,独立于各个字段上配置的分词器。

在查询时,拼接字段不支持范围查询。

仅支持以下类型的拼接字段:text、bool、i64、u64、json。其他类型会在创建索引时被拒绝,或者如果在 JSON 字段中发现,则在索引化过程中被静默丢弃。

向拼接字段添加对象字段不会自动添加其子字段(目前还不支持)。

无法从 JSON 字段添加子字段到拼接字段。例如,如果 attributes 是一个 JSON 字段,则无法仅将 attributes.color 添加到拼接字段中。

对于 JSON 字段和动态字段,仅索引值而不索引路径。例如,给定以下文档:

json 复制代码
{
  "421312": {
    "my-key": "my-value"
  }
}

可以搜索 my-value 而不必知道完整的路径,但无法搜索包含键 my-key 的所有文档。

Mode

mode 描述了当 Quickwit 接收到未在字段映射中定义的字段时的行为。

Quickwit 提供了三种不同的模式:

  • dynamic(默认值):未映射的字段会被 Quickwit 收集,并按照 dynamic_mapping 参数中定义的方式处理。
  • lenient:未映射的字段会被 Quickwit 忽略。
  • strict:如果文档包含未映射的字段,Quickwit 将会忽略该文档,并将其计为错误。
Dynamic Mapping(动态映射)

dynamic 模式使得可以在无模式或部分模式的情况下运行 Quickwit。dynamic 模式的配置可通过 dynamic_mapping 参数设置。dynamic_mapping 提供与配置 json 字段相同的配置选项,默认为:

yaml 复制代码
version: 0.7
index_id: my-dynamic-index
doc_mapping:
  mode: dynamic
  dynamic_mapping:
    indexed: true
    stored: true
    tokenizer: default
    record: basic
    expand_dots: true
    fast: true

dynamic_mapping 设置为已索引(默认),通过动态模式映射的字段可以通过针对从 JSON 对象根部访问它们所需的路径来搜索。

例如,在完全无模式的设置下,最简单的索引配置可能是:

yaml 复制代码
version: 0.7
index_id: my-dynamic-index
doc_mapping:
    # If you have a timestamp field, it is important to tell quickwit about it.
    timestamp_field: unix_timestamp
    # mode: dynamic #< Commented out, as dynamic is the default mode.

有了这样一个简单的配置,我们可以对一个复杂的文档进行索引,如下面所示:

json 复制代码
{
  "endpoint": "/admin",
  "query_params": {
    "ctk": "e42bb897d",
    "page": "eeb"
  },
  "src": {
    "ip": "8.8.8.8",
    "port": 53,
  },
  //...
}

以下查询是有效的,并匹配上述文档。

bash 复制代码
// Fields can be searched simply.
endpoint:/admin

// Nested object can be queried by specifying a `.` separated
// path from the root of the json object to the given field.
query_params.ctk:e42bb897d

// numbers are searchable too
src.port:53

// and of course we can combine them with boolean operators.
src.port:53 AND query_params.ctk:e42bb897d
Field name validation rules(字段名称验证规则)

目前 Quickwit 只接受符合以下正则表达式的字段名称:^[@$_\-a-zA-Z][@$_/\.\-a-zA-Z0-9]{0,254}$

用通俗的语言来说:

  • 需要有至少一个字符。
  • 只能包含大写和小写的 ASCII 字母 [a-zA-Z]、数字 [0-9].、破折号 -、下划线 _、斜杠 /、at 符号 @ 和美元符号 $
  • 不得以点号或数字开头。
  • 必须与 Quickwit 的保留字段映射名称 _source_dynamic_field_presence 不同。

对于包含 . 字符的字段名称,在引用它们时需要对其进行转义。否则 . 字符将被视为 JSON 对象属性的访问。因此,建议避免使用包含 . 字符的字段名称。

Behavior with null values or missing fields(对空值或缺失字段的行为)

JSON 文档中的 null 值或缺失字段在索引时将被静默忽略。

Indexing settings(索引设置)

本节描述了给定索引的索引设置。

变量 描述 默认值
commit_timeout_secs 自创建以来提交拆分的最大秒数。 60
split_num_docs_target 每个拆分的目标文档数。 10000000
merge_policy 描述触发拆分合并操作所采用的策略(参见下方的 合并策略 部分)。
resources.heap_size 每个来源每个索引的索引器堆大小。 2000000000
docstore_compression_level docstore 中使用的 zstd 压缩级别。较低的值可能会提高摄取速度,但代价是索引大小 8
docstore_blocksize docstore 中块的大小,以字节为单位。较小的值可能会提高文档检索速度,但代价是索引大小 1000000
Merge policies(合并策略)

Quickwit 使得可以定义用于决定哪些拆分应该合并以及何时合并的策略。

Quickwit 提供了三种不同的合并策略,每种都有自己的参数集。

"Stable log" merge policy("稳定日志"合并策略)

稳定日志合并策略试图最小化写入放大效应,并尽可能保持较高的时间修剪能力,通过合并大小相似且时间跨度相近的拆分。

Quickwit 默认的合并策略是 stable_log 合并策略,参数如下:

yaml 复制代码
version: 0.7
index_id: "hdfs"
# ...
indexing_settings:
  merge_policy:
    type: "stable_log"
    min_level_num_docs: 100000
    merge_factor: 10
    max_merge_factor: 12
    maturation_period: 48h
变量 描述 默认值
merge_factor (高级) 在单次合并操作中一起合并的拆分数目。 10
max_merge_factor (高级) 在单次合并操作中可以一起合并的最大拆分数目。 12
min_level_num_docs (高级) 文档数目低于此值的所有拆分被视为属于同一层级。 100000
maturation_period 拆分被视为成熟的时间期限,之后将不再考虑进行合并。可能会影响待处理删除任务的完成时间。 48h
"Limit Merge" merge policy("限制合并"合并策略)

"限制合并"合并策略被认为是高级功能

限制合并策略通过设置拆分应经历的合并操作次数的上限来简单地限制写入放大效应。

yaml 复制代码
version: 0.7
index_id: "hdfs"
# ...
indexing_settings:
  merge_policy:
    type: "limit_merge"
    max_merge_ops: 5
    merge_factor: 10
    max_merge_factor: 12
    maturation_period: 48h
变量 描述 默认值
max_merge_ops 给定拆分应经历的最大合并次数。 4
merge_factor (高级) 在单次合并操作中一起合并的拆分数目。 10
max_merge_factor (高级) 在单次合并操作中可以一起合并的最大拆分数目。 12
maturation_period 拆分被视为成熟的时间期限,之后将不再考虑进行合并。可能会影响待处理删除任务的完成时间。 48h
No merge(不合并)

no_merge 合并策略完全禁用合并。

此设置不推荐使用。合并是必要的,因为它可以减少拆分的数量,从而提高搜索性能。

yaml 复制代码
version: 0.7
index_id: "hdfs"
indexing_settings:
    merge_policy:
        type: "no_merge"
Indexer memory usage(索引器内存使用)

索引器默认使用 2 GiB 的堆内存。这并不直接反映总体内存使用情况,但将这个值加倍应该能得到一个合理的近似值。

本节描述了给定索引的搜索设置。

变量 描述 默认值
default_search_fields 用于搜索的默认字段列表。此列表中的字段名称可以在模式中显式声明,也可以引用由动态模式捕获的字段。 None

Retention policy(保留策略)

本节描述了 Quickwit 如何管理数据保留。在 Quickwit 中,保留策略管理器按拆分删除数据,而不是单独删除文档。拆分根据其 time_range 进行评估,该 time_range 来自索引时间戳字段(在 (doc_mapping.timestamp_field) 设置中指定)。使用此设置,当 now() - split.time_range.end >= retention_policy.period 时,保留策略将删除拆分。

yaml 复制代码
version: 0.7
index_id: hdfs
# ...
retention:
  period: 90 days
  schedule: daily
变量 描述 默认值
period 以人类可读方式表示的拆分被删除后的持续时间(如 1 day2 hoursa week 等)。 必需
schedule 以 cron 表达式 (0 0 * * * *) 或人类可读形式 (hourlydailyweeklymonthlyyearly) 表示的保留策略评估和应用的频率。 hourly

period 被指定为一系列时间间隔。每个时间间隔是一个整数后跟一个单位后缀,如:2 days 3h 24min。支持的单位有:

  • nsec, ns -- 纳秒
  • usec, us -- 微秒
  • msec, ms -- 毫秒
  • seconds, second, sec, s
  • minutes, minute, min, m
  • hours, hour, hr, h
  • days, day, d
  • weeks, week, w
  • months, month, M -- 一个月定义为 30.44 天
  • years, year, y -- 一年定义为 365.25 天

Metastore configuration

Quickwit 需要一个地方来存储关于其索引的元信息。

例如:

  • 索引配置。
  • 关于其拆分的元信息。例如,它们的 ID、包含的文档数量、大小、最小/最大时间戳以及拆分中存在的标签集。
  • 不同来源的检查点。
  • 一些额外的信息,如索引创建时间。

元存储完全由一个 URI 定义。可以通过编辑 节点配置文件(通常命名为 quickwit.yaml)中的 metastore_uri 参数来设置它。

目前,Quickwit 提供了两种实现:

  • PostgreSQL:推荐用于分布式使用。
  • File-backed implementation

PostgreSQL Metastore(PostgreSQL 元存储)

对于任何分布式使用场景,我们推荐使用 PostgreSQL 元存储。

可以通过在 Quickwit 配置文件中的 metastore_uri 参数设置 PostgreSQL URI 来配置 PostgreSQL 元存储。URI 的格式如下:

postgres://[user]:[password]@[host]:[port]/[dbname]

一些参数可以省略。以下 PostgreSQL URI 是有效的示例:

postgres://localhost/mydb
postgres://user@localhost
postgres://user:secret@localhost
postgres://host1:123,host2:456/mydb

数据库需要提前创建。

在首次执行时,Quickwit 将透明地创建必要的表。

同样,如果你将 Quickwit 升级到包含 PostgreSQL 模式更改的版本,Quickwit 将在启动时透明地执行迁移。

File-backed metastore(基于文件的元存储)

为了方便起见,Quickwit 还允许使用基于文件的元存储来将其元数据存储在文件中。在这种情况下,Quickwit 将为每个索引写一个文件。

然后通过传递一个 存储 URI 来配置元存储,该 URI 将作为元存储的根目录。

与给定索引关联的元数据文件将存储在

[storage_uri]/[index_id]/metastore.json

目前,Quickwit 支持两种类型的存储:

  • 本地文件系统 URI(例如,file:///opt/toto)。直接传递文件路径(不带 file://)也是有效的,例如 /var/quickwit。相对路径将相对于当前工作目录解析。
  • S3 兼容的存储 URI(例如,s3://my-bucket/some-path)。参阅 存储配置 文档来配置 S3 或 S3 兼容的存储提供商。

Polling configuration(拉取配置)

默认情况下,基于文件的元存储仅在启动 Quickwit 进程(如搜索器、索引器等)时读取一次。

您还可以配置它定期拉取基于文件的元存储以保持最新视图。这对于需要了解由并行运行的索引器发布的新的拆分的搜索器实例很有用。

要配置拉取间隔(以秒为单位),请向存储 URI 添加 URI 片段,如下所示:s3://quickwit/my-indexes#polling_interval=30s

拉取间隔只能以秒为单位配置;其他单位,如分钟或小时,不受支持。 Amazon S3 对每 1000 次 GET 请求收取 $0.0004 的费用。每 30 秒拉取一次元存储每月和每个索引的成本为 $0.04。

Examples(示例)

以下基于文件的元存储 URI 是有效的:

markdown 复制代码
s3://my-indexes
s3://quickwit/my-indexes
s3://quickwit/my-indexes#polling_interval=30s
file:///local/indices
file:///local/indices#polling_interval=30s
/local/indices
./quickwit-metastores

基于文件的元存储不支持同时运行多个实例,因为它没有实现任何锁定机制来防止并发写入相互覆盖。确保任何时候只运行一个基于文件的元存储实例。

Source configuration(数据来源配置)

Quickwit 可以从一个或多个来源将数据插入到索引中。

可以在创建索引后使用 CLI 命令 quickwit source create 添加来源。

也可以使用 quickwit source enable/disable 子命令启用或禁用来源。

来源是通过一个称为来源配置的对象声明的,该对象定义了来源的设置。它由多个参数组成:

  • 来源 ID
  • 来源类型
  • 来源参数
  • 输入格式
  • 每个索引器的最大管道数(可选)
  • 期望的管道数(可选)
  • 转换参数(可选)

Source ID(来源 ID)

来源 ID 是一个字符串,用于在索引内唯一标识来源。它只能包含大写或小写的 ASCII 字母、数字、连字符 (-) 和下划线 (_)。最后,它必须以字母开头,并且至少包含 3 个字符,但不超过 255 个。

Source type(来源类型)

来源类型指定了正在配置的来源种类。截至版本 0.5,可用的来源类型有 ingest-apikafkakinesispulsarfile 类型也受支持,但仅用于从 CLI 进行本地摄入。

Source parameters(来源参数)

来源参数指示如何连接到数据存储,并且特定于来源类型。

File source(文件数据来源)

文件来源从包含由新行分隔的 JSON 对象(NDJSON)的文件中读取数据。如果文件名以 .gz 后缀结尾,则支持 Gzip 压缩。

Ingest a single file (摄入特定文件 CLI only)

要摄入特定文件,请直接在临时 CLI 进程中运行索引:

bash 复制代码
./quickwit tool local-ingest --index <index> --input-path <input-path>

本地文件和对象文件都受支持,前提是环境已使用适当的权限进行配置。有一个教程可供参考 这里

Notification based file ingestion (基于通知的文件摄入 beta)

Quickwit 可以自动摄入所有上传到 S3 存储桶的新文件。这需要创建并配置一个 SQS 通知队列。一个完整的示例可以在 这个教程 中找到。

notifications 参数接受一个通知设置数组。目前每个来源可以配置一个通知器,并且仅支持 SQS 通知 type

SQS notifications 参数项所需的字段:

使用 CLI 向索引添加带有 SQS 通知的文件来源

bash 复制代码
cat << EOF > source-config.yaml
version: 0.8
source_id: my-sqs-file-source
source_type: file
num_pipelines: 2
params:
  notifications:
    - type: sqs
      queue_url: https://sqs.us-east-1.amazonaws.com/123456789012/queue-name
      message_type: s3_notification
EOF
./quickwit source create --index my-index --source-config source-config.yaml
  • Quickwit 在成功摄入后不会自动删除来源文件。您可以使用 S3 对象过期 来配置它们应在存储桶中保留多久。
  • 配置通知仅转发类型为 s3:ObjectCreated:* 的事件。其他事件会被来源确认,但不再进一步处理,并记录警告。
  • 我们强烈建议使用 死信队列 来接收所有无法被文件来源处理的消息。maxReceiveCount 的值为 5 是一个不错的默认值。以下是一些常见情况,其中通知消息最终会进入死信队列:
    • 通知消息无法解析(例如,它不是一个有效的 S3 通知)
    • 文件未找到
    • 文件损坏(例如,意外压缩)

https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.htmlhttps://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html

Ingest API source(Ingest API 来源)

Ingest API 来源从 Ingest API 读取数据。此来源会在创建索引时自动生成,不能删除或禁用。

Kafka source(Kafka 来源)

Kafka 来源从 Kafka 流中读取数据。流中的每条消息必须包含一个 JSON 对象。

有一个教程可供参考 这里

Kafka source parameters(Kafka 参数)

Kafka 来源使用客户端库 librdkafka 消费 topic,并将 client_params 参数携带的键值对转发给底层的 librdkafka 消费者。常见的 client_params 选项包括引导服务器 (bootstrap.servers) 或安全协议 (security.protocol)。请参阅 Kafkalibrdkafka 文档页面获取更高级的选项。

属性 描述 默认值
topic 要消费的主题名称。 必需
client_log_level librdkafka 客户端日志级别。可能的值是:debug、info、warn、error。 info
client_params librdkafka 客户端配置参数。 {}
enable_backfill_mode 回填模式在到达主题末尾后停止来源。 false

Kafka 客户端参数

  • bootstrap.servers

    逗号分隔的主机和端口对列表,这些是 Kafka 集群中 Kafka 经纪人的地址子集。

  • auto.offset.reset

    定义了来源在消费一个分区时的行为,该分区在检查点中没有保存初始偏移量。earliest 从分区开始消费,而 latest(默认)从分区末尾消费。

  • enable.auto.commit

    此设置被忽略,因为 Kafka 来源使用 检查点 API 内部管理提交偏移量,并强制禁用自动提交。

  • group.id

    基于 Kafka 的分布式索引依赖于消费者组。除非在客户端参数中覆盖,默认分配给来源管理的每个消费者的组 ID 是 quickwit-{index_uid}-{source_id}

  • max.poll.interval.ms

    短的最大轮询间隔持续时间可能会导致来源在索引器出现反压时崩溃。因此,Quickwit 建议使用默认值 300000(5 分钟)。

使用 CLI 向索引添加 Kafka 来源

bash 复制代码
cat << EOF > source-config.yaml
version: 0.8
source_id: my-kafka-source
source_type: kafka
num_pipelines: 2
params:
  topic: my-topic
  client_params:
    bootstrap.servers: localhost:9092
    security.protocol: SSL
EOF
./quickwit source create --index my-index --source-config source-config.yaml
Kinesis source(Kinesis 来源)

Kinesis 来源从 Amazon Kinesis 流中读取数据。流中的每条消息必须包含一个 JSON 对象。

有一个教程可供参考 这里

Kinesis source parameters

Kinesis 来源通过 stream_nameregion 消费一个流。

属性 描述 默认值
stream_name 要消费的流名称。 必需
region 流所在的 AWS 区域。与 endpoint 互斥。 us-east-1
endpoint 用于与 AWS 兼容的 Kinesis 服务一起使用的自定义端点。与 region 互斥。 可选

如果没有指定区域,Quickwit 将尝试在多个其他位置查找区域,并按照以下优先顺序:

  1. 环境变量 (AWS_REGION 然后是 AWS_DEFAULT_REGION)

  2. 配置文件,通常位于 ~/.aws/config 或者如果设置了 AWS_CONFIG_FILE 环境变量且不为空,则按其指定的位置。

  3. Amazon EC2 实例元数据服务确定当前运行的 Amazon EC2 实例所在的区域。

  4. 默认值:us-east-1

使用 CLI 向索引添加 Kinesis 来源

bash 复制代码
cat << EOF > source-config.yaml
version: 0.7
source_id: my-kinesis-source
source_type: kinesis
params:
  stream_name: my-stream
EOF
quickwit source create --index my-index --source-config source-config.yaml
Pulsar source(Pulsar 来源)

Pulsar 来源从一个或多个 Pulsar 主题读取数据。每个主题中的消息必须包含一个 JSON 对象。

有一个教程可供参考 这里

Pulsar source parameters

Pulsar 来源使用客户端库 pulsar-rs 消费 topics

属性 描述 默认值
topics 要消费的主题列表。 必需
address Pulsar URL(pulsar:// 和 pulsar+ssl://)。 必需
consumer_name 要与 Pulsar 来源注册的消费者名称。 quickwit

使用 CLI 向索引添加 Pulsar 来源

bash 复制代码
cat << EOF > source-config.yaml
version: 0.7
source_id: my-pulsar-source
source_type: pulsar
params:
  topics:
    - my-topic
  address: pulsar://localhost:6650
EOF
./quickwit source create --index my-index --source-config source-config.yaml

Number of pipelines(管道数量)

num_pipelines 参数仅适用于像 Kafka、GCP PubSub 和 Pulsar 这样的分布式来源。

它定义了要在集群上为来源运行的管道数量。这些管道在不同索引器上的实际放置将由控制平面决定。

请注意,对于像 Kafka 这样的分区来源,通过将不同的分区分配给不同的管道来分布索引负载。因此,重要的是确保分区的数量是 num_pipelines 的倍数。

此外,假设您只在 Quickwit 集群中索引单个 Kafka 来源,您应该将管道数量设置为索引器数量的倍数。最后,如果您的索引吞吐量很高,您应该为每个管道配置 2 到 4 个 vCPU。

例如,假设您想要索引一个 60 个分区的主题,每个分区接收 10 MB/s 的吞吐量。如果您测量到 Quickwit 可以以每管道 40 MB/s 的速度索引您的数据,那么可能的设置可以是:

  • 5 个索引器,每个有 8 个 vCPU
  • 15 个管道

这样,每个索引器将负责 3 个管道,每个管道将覆盖 4 个分区。

Transform parameters(转换参数)

除了 ingest-api 类型之外的所有来源类型,在索引之前可以使用 Vector Remap Language (VRL) 脚本转换摄取的文档。

属性 描述 默认值
script 执行以转换文档的 VRL 程序的源代码。 必需
timezone VRL 程序中用于日期和时间操作的时区。它必须是 TZ 数据库 中的有效名称。 UTC
yaml 复制代码
# Your source config here
# ...
transform:
  script: |
    .message = downcase(string!(.message))
    .timestamp = now()
    del(.username)
  timezone: local

Input format(输入格式)

input_format 参数指定了来源预期的数据格式。目前支持两种格式:

  • json: JSON,这是默认格式
  • plain_text: 非结构化文本文档

内部而言,Quickwit 只能索引 JSON 数据。为了允许摄取纯文本文档,Quickwit 会将它们实时转换成如下形式的 JSON 对象:{"plain_text": "<original plain text document>"}。然后,可以使用 VRL 脚本将它们可选地转换为更复杂的文档。(参见 transform 特性)。

下面是一个如何解析并转换包含用户列表的 CSV 数据集的例子,其中用户由 3 个属性描述:名字、姓氏和年龄。

yaml 复制代码
# Your source config here
# ...
input_format: plain_text
transform:
  script: |
    user = parse_csv!(.plain_text)
    .first_name = user[0]
    .last_name = user[1]
    .age = to_int!(user[2])
    del(.plain_text)

Enabling/Disabling a source from an index(启用/禁用索引中的来源)

可以通过 CLI 命令 quickwit source enablequickwit source disable 启用或禁用索引中的来源:

bash 复制代码
quickwit source disable --index my-index --source my-source

来源默认是启用的。当禁用一个来源时,相关的索引管道将在每个相关索引器上关闭,对该来源的索引也会暂停。

Deleting a source from an index(从索引中删除来源)

可以通过 CLI 命令 quickwit source delete 从索引中移除来源:

bash 复制代码
quickwit source delete --index my-index --source my-source

删除来源时,与来源关联的检查点也会被移除。

Ports configuration(端口配置)

当启动 Quickwit 搜索服务器时,可以配置的一个重要参数是 rest.listen_port(默认值为 7280)。

内部而言,Quickwit 实际上会使用三个套接字。这三个套接字的端口目前无法独立配置。

使用的端口相对于 rest.listen_port 端口计算得出,具体如下。

服务 使用的端口 协议 默认值
带 REST API 的 HTTP 服务器 ${rest.listen_port} TCP 7280
集群成员资格 ${rest.listen_port} UDP 7280
GRPC 服务 ${rest.listen_port} + 1 TCP 7281

目前无法独立配置这些端口。

为了形成集群,还需要定义一个 peer_seeds 参数。

以下地址是有效的对等种子地址:

类型 不带端口的示例 带端口的示例
IPv4 172.1.0.12 172.1.0.12:7180
IPv6 2001:0db8:85a3:0000:0000:8a2e:0370:7334 [2001:0db8:85a3:0000:0000:8a2e:0370:7334]:7280
主机名 node3 node3:7180

如果在对等节点地址中没有指定端口,Quickwit 节点将假定该对等节点使用与自己相同的端口。

更多

  1. Binance 如何使用 Quickwit 构建 100PB 日志服务(Quickwit 博客)
相关推荐
Elastic 中国社区官方博客4 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
jwolf24 小时前
摸一下elasticsearch8的AI能力:语义搜索/vector向量搜索案例
人工智能·搜索引擎
小马爱打代码8 小时前
Elasticsearch简介与实操
大数据·elasticsearch·搜索引擎
java1234_小锋17 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
AiFlutter19 小时前
Java实现简单的搜索引擎
java·搜索引擎·mybatis
梦幻通灵1 天前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
infiniteWei1 天前
【Lucene】搜索引擎和文档相关性评分 BM25 算法的工作原理
算法·搜索引擎·lucene
Elastic 中国社区官方博客2 天前
Elasticsearch:如何部署文本嵌入模型并将其用于语义搜索
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
infiniteWei2 天前
【Lucene】详解倒排表的结构,如何实现词典与文档的映射关系
搜索引擎·全文检索·lucene