• 普通表和实时表设置
在配置文件中定义表架构
配置文件中普通表的示例
配置文件中实时表的示例
通用平面和实时表设置
type
表类型: "plain" or "rt" (real-time)
值: plain (默认), rt
path
表将被存储或放置的位置路径,可以是绝对路径或相对路径,且不包含扩展名。
值:表的路径,必填
stored_fields
默认情况下,当在配置文件中定义表时,全文字段的原始内容会被索引和存储。此设置允许您指定应存储其原始值的字段。
值:要存储的全文字段的逗号分隔列表。空值(即 stored_fields =
)会禁用所有字段的原始值存储。
注意:在实时表的情况下,stored_fields
中列出的字段也应声明为 rt_field。
另外,注意您不需要在 stored_fields
中列出属性,因为它们的原始值无论如何都会被存储。stored_fields
只能用于全文字段。
另请参见 docstore_block_size、docstore_compression,以获取文档存储压缩选项。
SQL:
Python:
Javascript:
Java:
C#:
stored_only_fields
将存储在表中但不被索引的字段列表。此设置的工作方式与 存储字段 类似,不同之处在于,当字段在 stored_only_fields
中指定时,它仅会被存储,而不会被索引,因此无法使用全文查询进行搜索。它只能在搜索结果中检索。
值是一个以逗号分隔的字段列表,这些字段应仅存储而不被索引。默认情况下,此值为空。如果正在定义实时表,则 stored_only_fields
中列出的字段必须也声明为 rt_field。
另请注意,您不需要在 stored_only_fields
中列出属性,因为它们的原始值无论如何都会被存储。将 stored_only_fields
与字符串属性进行比较时,前者(存储字段):
存储在磁盘上,不占用内存
以压缩格式存储
只能被获取,不能用于排序、过滤或分组
相对而言,后者(字符串属性):
存储在磁盘上和内存中
以未压缩格式存储
可用于排序、分组、过滤及任何您想要对属性进行的其他操作。
json_secondary_indexes
默认情况下,所有属性都会生成二级索引,除了 JSON 属性。然而,可以通过 json_secondary_indexes
设置显式生成 JSON 属性的二级索引。当 JSON 属性包含在此选项中时,其内容会被展平为多个二级索引。这些索引可以被查询优化器用于加速查询。
值:一个以逗号分隔的 JSON 属性列表,用于生成二级索引。
SQL:
Python:
Javascript:
Java:
C#:
实时表设置
optimize_cutoff
实时表的最大磁盘块数量。了解更多信息 这里。
rt_field
此字段声明确定将被索引的全文本字段。字段名称必须是唯一的,顺序会被保留。在插入数据时,字段值必须与配置中指定的顺序相同。
这是一个多值的可选字段。
rt_attr_uint
此声明定义了一个无符号整数属性。
值:字段名称或字段名称
(其中 N 是要保留的最大位数)。
rt_attr_bigint
此声明定义了一个 BIGINT 属性。
值:字段名称,允许多个记录。
rt_attr_multi
声明一个具有无符号 32 位整数值的多值属性(MVA)。
值:字段名称。允许多个记录。
rt_attr_multi_64
声明一个具有有符号 64 位 BIGINT 值的多值属性(MVA)。
值:字段名称。允许多个记录。
rt_attr_float
声明使用单精度、32 位 IEEE 754 格式的浮点属性。
值:字段名称。允许多个记录。
rt_attr_float_vector
声明一个浮点值的向量。
值:字段名称。允许多个记录。
rt_attr_bool
声明一个具有 1 位无符号整数值的布尔属性。
值:字段名称。
rt_attr_string
字符串属性声明。
值:字段名称。
rt_attr_json
声明一个 JSON 属性。
值:字段名称。
rt_attr_timestamp
声明一个时间戳属性。
值:字段名称。
rt_mem_limit
表的 RAM 块的内存限制。可选,默认值为 128M。
RT 表将一些数据存储在内存中,称为“RAM 块”,并维护多个称为“磁盘块”的磁盘表。此指令允许您控制 RAM 块的大小。当内存中要保留的数据过多时,RT 表将其刷新到磁盘,激活新创建的磁盘块,并重置 RAM 块。
请注意,限制是严格的,RT 表永远不会分配超过 rt_mem_limit
指定的内存。此外,内存不会预分配,因此指定 512MB 限制并只插入 3MB 数据将导致只分配 3MB,而不是 512MB。
rt_mem_limit
从不被超出,但实际的 RAM 块大小可能显著低于限制。RT 表根据数据插入速度进行调整,动态调整实际限制以最小化内存使用并最大化数据写入速度。其工作原理如下:
默认情况下,RAM 块大小为
rt_mem_limit
的 50%,称为 "rt_mem_limit
"。一旦 RAM 块累计的数据达到
rt_mem_limit * rate
(默认为rt_mem_limit
的 50%),Manticore 开始将 RAM 块保存为新的磁盘块。在保存新的磁盘块时,Manticore 评估新增/更新的文档数量。
保存新的磁盘块后,更新
rt_mem_limit
速率。每次重启
searchd
时,速率都会重置为 50%。
例如,如果 90MB 的数据被保存到磁盘块,并且在保存过程中再到达 10MB 的数据,速率将达到 90%。下次,RT 表将在刷新数据之前收集最多 90% 的 rt_mem_limit
。插入速度越快,rt_mem_limit
速率越低。速率在 33.3% 到 95% 之间变化。您可以使用 SHOW TABLE STATUS 命令查看表的当前速率。
如何更改 rt_mem_limit 和 optimize_cutoff
在实时模式下,您可以使用 ALTER TABLE
语句调整 RAM 块的大小限制和最大磁盘块数。要将表“t”的 rt_mem_limit
设置为 1GB,请运行以下查询:ALTER TABLE t rt_mem_limit='1G'
。要更改最大磁盘块数,请运行查询:ALTER TABLE t optimize_cutoff='5'
。
在普通模式下,您可以通过更新表配置或运行命令 ALTER TABLE <index_name> RECONFIGURE
来更改 rt_mem_limit
和 optimize_cutoff
的值。
关于 RAM 块的重要说明
实时表类似于包含多个本地表的 分布式,也称为磁盘块。
每个 RAM 块由多个段组成,这些段是特殊的仅在 RAM 中的表。
磁盘块存储在磁盘上,而 RAM 块存储在内存中。
对实时表进行的每个事务都会生成一个新的段,而 RAM 块段会在每次事务提交后合并。执行数百或数千个文档的批量 INSERT 比多次单独插入一条文档更有效,以减少合并 RAM 块段的开销。
当段的数量超过 32 时,它们将被合并,以保持数量低于 32。
实时表始终有一个 RAM 块(可能为空)和一个或多个磁盘块。
合并较大的段需要更长的时间,因此最好避免具有非常大的 RAM 块(因此
rt_mem_limit
)。磁盘块的数量取决于表中的数据和
rt_mem_limit
设置。Searchd 根据 rt_flush_period 设置定期将 RAM 块刷新到磁盘(作为持久文件,而不是磁盘块)。将几 GB 的数据刷新到磁盘可能需要一些时间。
大 RAM 块在将数据刷新到磁盘的
.ram
文件时以及当 RAM 块满并转储到磁盘作为磁盘块时,会对存储施加更大压力。RAM 块在刷新到磁盘之前会被 二进制日志 备份,而较大的
rt_mem_limit
设置会增加重放二进制日志和恢复 RAM 块所需的时间。RAM 块可能比磁盘块稍慢。
尽管 RAM 块本身不会占用超过
rt_mem_limit
的内存,但在某些情况下,Manticore 可能会占用更多内存,例如当您开始一个事务以插入数据并且一段时间内不提交时。在这种情况下,您在事务中已经传输的数据将保留在内存中。
普通表设置:
source
source 字段指定在当前表索引过程中获取文档的来源。至少必须有一个来源。这些来源可以是不同类型的(例如,一个可以是 MySQL,另一个可以是 PostgreSQL)。有关从外部存储进行索引的更多信息,请参阅 从外部存储进行索引。
值:源的名称是 必填。允许多个值。
killlist_target
此设置确定将应用于 kill-list 的表。如果在当前表中更新或删除的匹配项在目标表中存在,则将被抑制。在 :kl
模式下,要抑制的文档取自 kill-list。在 :id
模式下,当前表中的所有文档 ID 在目标表中都将被抑制。如果都不指定,则两种模式均会生效。了解更多关于 kill-lists 的信息。
值:未指定(默认)、target_index_name
、target_index_name
、target_index_name。允许多个值。
columnar_attrs
平面表设置:
source
source 字段指定在当前表索引过程中获取文档的来源。至少必须有一个来源。这些来源可以是不同类型的(例如,一个可以是 MySQL,另一个可以是 PostgreSQL)。有关从外部存储进行索引的更多信息,请参阅 从外部存储进行索引。
值:源的名称是 必填。允许多个值。
killlist_target
此设置确定将应用于 kill-list 的表。如果在当前表中更新或删除的匹配项在目标表中存在,则将被抑制。在 :kl
模式下,要抑制的文档取自 kill-list。在 :id
模式下,当前表中的所有文档 ID 在目标表中都将被抑制。如果都不指定,则两种模式均会生效。了解更多关于 kill-lists 的信息。
值:未指定(默认)、target_index_name
、target_index_name
、target_index_name。允许多个值。
columnar_attrs
此配置设置决定哪些属性应存储在 列式存储 中,而不是行式存储。
您可以设置 columnar_attrs = *
将所有支持的数据类型存储在列式存储中。
此外,id
是一个支持存储在列式存储中的属性。
columnar_strings_no_hash
默认情况下,所有存储在列式存储中的字符串属性都会存储预计算的哈希值。这些哈希值用于分组和过滤。然而,它们会占用额外的空间,如果您不需要按该属性进行分组,则可以通过禁用哈希生成来节省空间。
通过CREATE TABLE在线创建实时表
CREATE TABLE的通用语法
数据类型:
有关数据类型的更多信息,请参阅有关数据类型的更多信息。
选项:indexed, stored。默认值:both。要仅保留文本存储但索引,请仅指定“stored”。要仅保留文本索引,请仅指定“indexed”。
string
integer
int, uint
big integer
float
浮点值向量
多个整数
多个大整数
布尔值
JSON
字符串。选项indexed, attribute
将使值进行全文索引,并同时可过滤、排序和分组。
时间戳
N是保留的最大位数
通过CREATE TABLE创建实时表的示例
这将创建一个名为“products”的表,其中包含两个字段:“title”(全文)和“price”(浮点数),并将“morphology”设置为“stem_en”。
这将创建一个名为“products”的表,其中包含三个字段:
“title”被索引,但未存储。
“description”被存储,但未被索引。
“author”同时被存储和索引。
引擎
engine
设置更改表中所有属性的默认 属性存储。你还可以为每个属性单独指定 engine
设置。
有关如何为普通表启用列式存储的信息,请参阅 columnar_attrs。
值:
columnar
- 为所有表属性启用列式存储,除了 jsonrowwise(默认) - 不做任何更改,并使用传统的行式存储。
其他设置
以下设置适用于实时表和普通表,无论是指定在配置文件中,还是通过 CREATE
或 ALTER
命令在线设置。
性能相关
访问表文件
Manticore 支持两种读取表数据的访问模式:seek+read 和 mmap。
在 seek+read 模式下,服务器使用 pread
系统调用读取文档列表和关键字位置,这些位置由 *.spd
和 *.spp
文件表示。服务器使用内部读取缓冲区来优化读取过程,这些缓冲区的大小可以通过选项 read_buffer_docs 和 read_buffer_hits 调整。还有一个选项 preopen 控制 Manticore 启动时如何打开文件。
在 mmap 访问模式下,搜索服务器使用 mmap
系统调用将表文件映射到内存中,操作系统缓存文件内容。选项 read_buffer_docs 和 read_buffer_hits 对该模式下的相应文件无效。mmap 读取器还可以使用 mlock
特权调用锁定表的数据在内存中,防止操作系统将缓存的数据换出到磁盘。
要控制使用哪种访问模式,可以使用以下选项 access_plain_attrs、access_blob_attrs、access_doclists、access_hitlists 和 access_dict,其值如下:
file
服务器使用 seek+read 从磁盘读取表文件,使用内部缓冲区进行文件访问
mmap
服务器将表文件映射到内存,操作系统在文件访问时缓存其内容
mmap_preread
服务器将表文件映射到内存,后台线程先读取一次以预热缓存
mlock
服务器将表文件映射到内存,然后执行 mlock() 系统调用以缓存文件内容并将其锁定在内存中,防止其被换出
access_plain_attrs
mmap、mmap_preread(默认)、mlock
控制 *.spa
(普通属性)*.spe
(跳过列表)*.spt
(查找)*.spm
(已删除文档)的读取方式
access_blob_attrs
mmap、mmap_preread(默认)、mlock
控制 *.spb
(Blob 属性)(字符串、MVA 和 JSON 属性)的读取方式
access_doclists
file(默认)、mmap、mlock
控制 *.spd
(文档列表)数据的读取方式
access_hitlists
file(默认)、mmap、mlock
控制 *.spp
(命中列表)数据的读取方式
access_dict
mmap、mmap_preread(默认)、mlock
控制 *.spi
(字典)的读取方式
以下表格可帮助你选择所需的模式:
mmap
mmap
mmap_preread(默认)
mlock
行式字符串、多值属性(MVA)和 JSON 属性
mmap
mmap
mmap_preread(默认)
mlock
始终
仅通过操作系统
无
不支持
文档列表
file(默认)
mmap
无
mlock
命中列表
file(默认)
mmap
无
mlock
字典
mmap
mmap
mmap_preread(默认)
mlock
建议如下:
为了获得最快的搜索响应时间并有足够的内存,使用 行式 属性,并通过
mlock
将其锁定在内存中。此外,还应对文档列表/命中列表使用mlock
。如果你优先考虑启动后无法承受较低的性能,并愿意牺牲更长的启动时间,请使用 --force-preread 选项。如果你希望更快的 searchd 重启,请坚持使用默认的
mmap_preread
选项。如果你希望节省内存,同时仍然有足够的内存存储所有属性,请跳过使用
mlock
。操作系统将决定哪些内容应保持在内存中,基于频繁的磁盘读取。如果行式属性不适合内存,则选择 列式属性。
如果全文搜索性能不是问题,并希望节省内存,请使用
access_doclists/access_hitlists=file
。
默认模式提供了一个平衡:
mmap,
预读取非列式属性,
使用无预读取的方式查找和读取列式属性,
使用无预读取的方式查找和读取文档列表/命中列表。
在大多数场景中,这提供了良好的搜索性能、最佳的内存利用率和更快的 searchd 重启。
其他性能相关设置
attr_update_reserve
此设置为更新 Blob 属性(如多值属性(MVA)、字符串和 JSON)保留额外空间。默认值为 128k。在更新这些属性时,它们的长度可能会改变。如果更新后的字符串短于之前的字符串,它将覆盖 *.spb
文件中的旧数据。如果更新后的字符串更长,则将写入 *.spb
文件的末尾。该文件是内存映射的,这使得调整大小的过程可能会较慢,具体取决于操作系统的内存映射文件实现。为了避免频繁的调整大小,可以使用此设置在 .spb 文件末尾保留额外空间。
值:大小,默认 128k。
docstore_block_size
此设置控制文档存储使用的块大小。默认值为 16kb。当原始文档文本使用 stored_fields
或 stored_only_fields
存储时,它会在表内存储并进行压缩以提高效率。为了优化小文档的磁盘访问和压缩比,这些文档被连接成块。索引过程收集文档,直到其总大小达到此选项指定的阈值。此时,文档块会被压缩。可以调整此选项以获得更好的压缩比(通过增大块大小)或更快的文档文本访问(通过减小块大小)。
值:大小,默认 16k。
docstore_compression
此设置决定用于压缩存储在文档存储中的文档块的压缩类型。如果指定了 stored_fields
或 stored_only_fields
,文档存储将存储压缩的文档块。lz4
提供快速的压缩和解压速度,而 lz4hc
(高压缩)则在获得更好压缩比的同时牺牲了一些压缩速度。none
完全禁用压缩。
值:lz4(默认)、lz4hc
、none
。
docstore_compression_level
在文档存储中应用 lz4hc
压缩时使用的压缩级别。通过调整压缩级别,你可以在使用 lz4hc
压缩时找到性能与压缩比之间的最佳平衡。请注意,当使用 lz4
压缩时,此选项不适用。
值:介于 1 到 12 之间的整数,默认 9。
preopen
此设置指示 searchd
在启动或轮换时打开所有表文件,并在运行时保持它们处于打开状态。默认情况下,文件不会预先打开。预打开的表每个表需要一些文件描述符,但它们消除了每次查询的 open() 调用的需要,并且在高负载下的表轮换期间不会发生竞争条件。然而,如果你服务许多表,仍然可能更有效地按查询打开它们,以节省文件描述符。
值:0(默认)或 1。
read_buffer_docs
用于存储每个关键字文档列表的缓冲区大小。增加此值将导致查询执行期间的内存使用量增加,但可能减少 I/O 时间。
值:大小,默认 256k,最小值为 8k。
read_buffer_hits
用于存储每个关键字命中列表的缓冲区大小。增加此值将导致查询执行期间的内存使用量增加,但可能减少 I/O 时间。
值:大小,默认 256k,最小值为 8k。
普通表磁盘占用设置
inplace_enable
启用就地表反转。可选,默认值为 0(使用单独的临时文件)。
inplace_enable
选项在索引普通表时减少磁盘占用,但会稍微降低索引速度(大约使用 2 倍更少的磁盘,但性能约为原始性能的 90-95%)。
索引分为两个主要阶段。在第一个阶段,文档被收集、处理并按关键字部分排序,结果中间结果被写入临时文件(.tmp*)。在第二个阶段,文档被完全排序,最终的表文件被创建。实时重建生产表需要大约 3 倍的峰值磁盘占用:首先是中间临时文件,其次是新构建的副本,最后是将在此期间服务生产查询的旧表。(中间数据的大小与最终表相当。)这对于大型数据集可能过于占用磁盘,而 inplace_enable
选项可以用来减少占用。当启用时,它重用临时文件,将最终数据输出回这些文件,并在完成后重命名它们。然而,这可能需要额外的临时数据块重新定位,这就是性能影响的来源。
此指令对 searchd 没有影响,仅对 indexer 产生影响。
CONFIG:
inplace_hit_gap
此选项是 inplace_enable 的微调选项。控制预分配的命中列表间隙大小。可选,默认值为 0。
此指令仅影响 searchd 工具,对 indexer 没有影响。
CONFIG:
inplace_reloc_factor
inplace_reloc_factor
设置决定了在索引期间使用的内存区域内重新定位缓冲区的大小。默认值为 0.1。
此选项是可选的,仅影响 indexer 工具,而不影响 searchd 服务器。
CONFIG:
inplace_write_factor
控制索引过程中就地写入时使用的缓冲区大小。可选,默认值为 0.1。
需要注意的是,此指令仅影响 indexer 工具,对 searchd 服务器没有影响。
CONFIG:
自然语言处理特定设置
支持以下设置。它们都在 NLP 和分词 部分进行了描述。
最后更新于