令牌过滤器插件允许您实现一个自定义的分词器,根据自定义规则创建令牌。有两种类型:
- 由表设置中的 index_token_filter 声明的索引时分词器
- 由 token_filter OPTION 指令声明的查询时分词器
在文本处理管道中,令牌过滤器将在基础分词器处理(处理字段或查询中的文本并从中创建令牌)之后运行。
索引时分词器由 indexer 在将源数据索引到表中时创建,或者由 RT 表在处理 INSERT 或 REPLACE 语句时创建。
插件声明格式为 library name:plugin name:optional string of settings。插件的初始化函数可以接受任意设置,这些设置可以作为字符串传递,格式为 option1=value1;option2=value2;..。
示例:
index_token_filter = my_lib.so:email_process:field=email;split=.io
索引时令牌过滤器的调用流程如下:
XXX_init()在indexer创建令牌过滤器时调用,初始时字段列表为空,随后在indexer获取表模式及实际字段列表后再次调用。它必须返回零表示初始化成功,否则返回错误描述。XXX_begin_document仅在 RT 表的INSERT/REPLACE操作中为每个文档调用。它必须返回零表示调用成功,否则返回错误描述。通过 OPTIONtoken_filter_options,可以向函数传递额外的参数/设置。INSERT INTO rt (id, title) VALUES (1, 'some text corp@space.io') OPTION token_filter_options='.io'XXX_begin_field在处理字段的基础分词器之前为每个字段调用一次,参数为字段编号。XXX_push_token为基础分词器产生的每个新令牌调用一次,参数为源令牌。它必须返回令牌、令牌过滤器产生的额外令牌数量以及该令牌的位置增量。XXX_get_extra_token在XXX_push_token报告有额外令牌时调用多次。它必须返回该额外令牌及其位置增量。XXX_end_field在当前字段的源令牌处理完毕后调用一次。XXX_deinit在索引结束时调用。
必须定义以下函数:XXX_begin_document、XXX_push_token 和 XXX_get_extra_token。
查询时分词器在每次全文搜索时为每个涉及的表创建。
查询时令牌过滤器的调用流程如下:
XXX_init()在解析查询之前为每个表调用一次,参数为最大令牌长度和由token_filter选项设置的字符串SELECT * FROM index WHERE MATCH ('test') OPTION token_filter='my_lib.so:query_email_process:io'它必须返回零表示初始化成功,否则返回错误描述。
XXX_push_token()为基础分词器产生的每个新令牌调用一次,参数为基础分词器产生的令牌、指向源查询字符串中原始令牌的指针以及原始令牌长度。它必须返回令牌及该令牌的位置增量。XXX_pre_morph()在令牌传递给形态学处理器之前调用一次,参数为令牌引用和停用词标志。它可以设置停用词标志以将令牌标记为停用词。XXX_post_morph()在令牌经过形态学处理器处理后调用一次,参数为令牌引用和停用词标志。它可以设置停用词标志以将令牌标记为停用词。它必须返回一个标志,非零值表示使用形态学处理之前的令牌。XXX_deinit()在查询处理结束时调用。
缺少这些函数是允许的。
indextool 是一个有用的工具,用于提取有关物理表的各种信息,但不包括 template 或 distributed 表。以下是使用 indextool 的一般语法:
indextool <command> [options]
这些选项适用于所有命令:
--config <file>(简写为-c <file>)允许您覆盖默认的配置文件名。--quiet(简写为-q)抑制indextool输出的横幅等信息。--help(简写为-h)显示您特定版本的indextool中可用的所有参数。-v显示您特定版本的indextool的版本信息。
以下是可用的命令:
--checkconfig加载并验证配置文件,检查其有效性及语法错误。--buildidf DICTFILE1 [DICTFILE2 ...] --out IDFILE从一个或多个字典转储文件(参见--dumpdict)构建 IDF 文件。额外参数--skip-uniq会省略唯一词(df=1)。--build-infixes TABLENAME为已有的 dict=keywords 表生成中缀(infixes)(就地更新 .sph、.spi 文件)。此选项适用于已经使用 dict=keywords 的旧表文件,但现在需要支持中缀搜索;使用 indextool 更新表文件可能比用 indexer 重新创建更简单或更快。--dumpheader FILENAME.sph立即转储指定的表头文件,而不影响其他表文件或配置文件。报告详细显示所有表设置,特别是完整的属性和字段列表。--dumpconfig FILENAME.sph以(几乎)符合 manticore.conf 文件格式的方式提取指定表头文件中的表定义。--dumpheader TABLENAME通过表名转储表头,同时在配置文件中搜索表头路径。--dumpdict TABLENAME转储字典。额外的-stats开关会在字典转储中添加总文档数。这对于用于 IDF 文件创建的字典文件是必要的。--dumpdocids TABLENAME按表名转储文档 ID。--dumphitlist TABLENAME KEYWORD转储指定表中指定关键词的所有实例(出现位置),关键词以文本形式定义。--dumphitlist TABLENAME --wordid ID转储指定表中指定关键词的所有实例(出现位置),关键词以内部数字 ID 表示。--dumpkilllist TABLENAME转储指定表的 kill list 内容,包括目标和标志。也可用作--dumpkilllist FILENAME.spk。--docextract TBL DOCID执行整个字典/文档/命中标准表检查,并收集请求文档相关的所有词和命中。随后,所有词按字段和位置排列,结果按字段分组打印。--fold TABLENAME OPTFILE此选项帮助理解分词器如何处理输入。您可以向 indextool 提供来自文件的文本(如果指定了文件),否则从标准输入读取。输出将根据您的charset_table设置将分隔符替换为空格,并将词中的字母转换为小写。--htmlstrip TABLENAME对指定表应用 HTML 去除器设置以过滤标准输入,并将过滤结果发送到标准输出。请注意,设置将从 manticore.conf 中获取,而非表头。--mergeidf NODE1.idf [NODE2.idf ...] --out GLOBAL.idf将多个 .idf 文件合并为一个。额外参数--skip-uniq会忽略唯一词(df=1)。--morph TABLENAME对给定的标准输入应用形态学处理,并将结果输出到标准输出。--check TABLENAME检查表数据文件的一致性错误,这些错误可能由indexer的缺陷或硬件故障引起。--check也适用于 RT 表、RAM 和磁盘块。附加选项:--check-id-dups检查普通表和 RT 表所有磁盘块中的重复文档 ID--check-disk-chunk CHUNK_NAME仅检查 RT 表的特定磁盘块。参数是要检查的 RT 表磁盘块的数字扩展名。
--strip-path从表引用的所有文件名中移除路径名(如停用词、词形变化、例外等)。这在验证在不同机器上构建且路径布局可能不同的表时很有用。--rotate仅与--check兼容,决定是否检查等待旋转的表,即带有 .new 扩展名的表。这在您希望在实际使用表之前验证表时很有用。--apply-killlists加载并应用配置文件中列出的所有表的 kill-list。更改保存到 .SPM 文件。kill-list 文件 (.SPK) 被删除。如果您想将表的应用从服务器启动阶段转移到索引阶段,这很方便。
indextool 无法完全检查当前由守护进程服务的 RT 表。当尝试检查活动的 RT 表时,您可能会遇到以下警告:
WARNING: failed to load RAM chunks, checking only N disk chunks
为避免这些警告并确保正确检查 RT 表,请考虑以下方法:
- 在运行
indextool --check之前停止守护进程。 - 确保 RT 表未被守护进程主动服务。
- 检查 RT 表的单独副本,而非实时表。
如果无法停止守护进程,您可以在运行 indextool --check 之前执行以下 MySQL 语句,以防止对 RT 表的意外修改:
SET GLOBAL AUTO_OPTIMIZE=0;
此命令阻止守护进程执行自动优化,确保 RT 表文件保持不变。执行此语句后,等待优化线程完全停止,然后再进行 indextool --check。这确保在检查过程中不会无意中修改或删除磁盘块。
如果之前启用了自动优化,检查完成后应手动重新启用它,方法是运行:
SET GLOBAL AUTO_OPTIMIZE=1;
spelldump 命令用于从采用 ispell 或 MySpell 格式的字典文件中提取内容。当您需要为词形编译单词列表时,这非常有用,因为它会为您生成所有可能的词形。
其一般语法如下:
spelldump [options] <dictionary> <affix> [result] [locale-name]
主要参数是字典的主文件和词缀文件。通常,这些文件分别命名为 [language-prefix].dict 和 [language-prefix].aff。您可以在大多数标准 Linux 发行版或许多在线资源中找到这些文件。
[result] 参数是提取的字典数据将被存储的位置,[locale-name] 是用于指定您选择的区域设置的参数。
还有一个可选的 -c [file] 选项。此选项允许您指定一个用于大小写转换细节的文件。
以下是一些使用示例:
spelldump en.dict en.aff
spelldump ru.dict ru.aff ru.txt ru_RU.CP1251
spelldump ru.dict ru.aff ru.txt .1251
生成的文件将列出字典中的所有单词,按字母顺序排列,并格式化为类似词形文件的形式。然后,您可以根据具体需求修改此文件。以下是输出文件可能的示例:
zone > zone
zoned > zoned
zoning > zoning
wordbreaker 工具用于拆解复合词,这在 URL 中很常见,将其分解为单独的组成部分。例如,它可以将 "lordoftherings" 拆分为四个单词,或将 http://manofsteel.warnerbros.com 拆分为 "man of steel warner bros"。这种能力增强了搜索功能,无需使用前缀或中缀。例如,搜索 "sphinx" 不会在结果中出现 "sphinxsearch"。但是,如果您应用 wordbreaker 拆解复合词并索引拆分后的元素,搜索将成功,且不会像全文索引中使用前缀或中缀那样导致文件大小膨胀。
以下是一些使用 wordbreaker 的示例:
echo manofsteel | bin/wordbreaker -dict dict.txt split
man of steel
-dict 字典文件用于将输入流分割成单个单词。如果未指定字典文件,Wordbreaker 会在当前工作目录中查找名为 wordbreaker-dict.txt 的文件。(确保字典文件与您处理的复合词的语言匹配。)split 命令从标准输入拆分单词并将结果发送到标准输出。test 和 bench 命令分别用于评估拆分质量和测量拆分函数的性能。
Wordbreaker 使用字典来识别给定字符串中的单个子串。为了区分多种可能的拆分,它会考虑字典中每个单词的相对频率。频率越高,单词拆分的可能性越大。要生成此类文件,您可以使用 indexer 工具:
indexer --buildstops dict.txt 100000 --buildfreqs myindex -c /path/to/manticore.conf
它将生成一个名为 dict.txt 的文本文件,包含 myindex 中出现频率最高的 100,000 个单词及其各自的计数。由于此输出文件是简单的文本文件,您可以随时手动编辑它。根据需要随意添加或删除单词。
Manticore Search API 使用 OpenAPI 规范进行文档编写,可用于生成客户端 SDK。机器可读的 YAML 文件可在 https://raw.githubusercontent.com/manticoresoftware/openapi/master/manticore.yml 获取
您也可以在在线 Swagger 编辑器中查看该规范的可视化版本,点击这里。
在 Manticore,我们收集各种匿名指标以提升我们产品的质量,包括 Manticore Search。通过分析这些数据,我们不仅可以改进产品的整体性能,还能识别出哪些功能最值得优先开发,从而为用户提供更多价值。遥测系统在一个独立线程中以非阻塞模式运行,每隔几分钟采集快照并发送。
我们非常重视您的隐私,您可以放心,所有指标都是完全匿名的,不会传输任何敏感信息。不过,如果您仍希望禁用遥测,可以通过以下方式实现:
- 设置环境变量
TELEMETRY=0 - 或在配置文件的
searchd部分设置telemetry = 0
以下是我们收集的所有指标列表:
⏱️ 符号表示该指标是周期性收集的,而其他指标则是基于特定事件收集的。
| 指标 | 描述 |
|---|---|
invocation |
当 Manticore Buddy 启动时发送 |
plugin_* |
表示执行了指定名称的插件,例如 plugin_backup 表示执行了备份插件 |
command_* |
⏱️ 所有以此前缀开头的指标均来自 Manticore 守护进程的 show status 查询 |
uptime |
⏱️ Manticore Search 守护进程的运行时间 |
workers_total |
⏱️ Manticore 使用的工作线程数 |
cluster_count |
⏱️ 此节点处理的集群数量 |
cluster_size |
⏱️ 所有集群中的节点总数 |
table_*_count |
⏱️ 按类型统计创建的表数量:plain、percolate、rt 或 distributed |
*_field_*_count |
⏱️ rt 和 percolate 类型表中各字段类型的计数 |
columnar |
⏱️ 表示使用了 Columnar 库 |
columnar_field_count |
⏱️ 使用 Columnar 库的字段数量 |
Manticore 备份工具默认会向 Manticore 指标服务器发送匿名指标,以帮助改进产品。如果您不想发送遥测数据,可以通过添加 --disable-metric 参数运行工具,或设置环境变量 TELEMETRY=0 来禁用。
以下是所有收集的指标列表:
| 指标 | 描述 |
|---|---|
invocation |
备份启动时发送 |
failed |
备份失败时发送 |
done |
备份/恢复成功时发送 |
arg_* |
运行工具时使用的参数(不包括索引名称等) |
backup_store_versions_fails |
备份中保存 Manticore 版本失败的指标 |
backup_table_count |
备份的表总数 |
backup_no_permissions |
由于目标目录权限不足导致备份失败 |
backup_total_size |
完整备份的总大小 |
backup_time |
备份耗时 |
restore_searchd_running |
恢复失败,因 searchd 已在运行 |
restore_no_config_file |
恢复时备份中未找到配置文件 |
restore_time |
恢复耗时 |
fsync_time |
fsync 耗时 |
restore_target_exists |
恢复目标文件夹或索引已存在 |
terminations |
进程被终止的指标 |
signal_* |
用于终止进程的信号 |
tables |
Manticore 中的表数量 |
config_unreachable |
指定的配置文件不存在 |
config_data_dir_missing |
无法从指定配置文件解析 data_dir |
config_data_dir_is_relative |
Manticore 实例配置文件中的 data_dir 路径为相对路径 |
每个指标都带有以下标签:
| 标签 | 描述 |
|---|---|
collector |
buddy。表示该指标通过 Manticore Buddy 收集 |
os_name |
操作系统名称 |
os_release_name |
来自 /etc/os-release 的名称(如果存在),否则为 unknown |
os_release_version |
来自 /etc/os-release 的版本(如果存在),否则为 unknown |
dockerized |
是否在 Docker 环境中运行 |
official_docker |
如果是 Docker,表示使用的是官方镜像 |
machine_id |
服务器标识符(Linux 中 /etc/machine-id 的内容) |
arch |
运行机器的架构 |
manticore_version |
Manticore 版本 |
columnar_version |
如果安装了 Columnar 库,则为其版本 |
secondary_version |
如果安装了 Columnar 库,则为 secondary 库版本 |
knn_version |
如果安装了 Columnar 库,则为 KNN 库版本 |
buddy_version |
Manticore Buddy 版本 |