为了简化对 Buddy 插件的控制,特别是在开发新插件或修改现有插件时,提供了启用和禁用 Buddy 插件的命令。这些命令在运行时临时生效,重启守护进程或执行 Buddy 重置后将恢复默认状态。要永久禁用插件,必须将其移除。
您需要插件的完全限定包名来启用或禁用它。要查找该名称,可以运行 SHOW BUDDY PLUGINS 查询,并在 package 字段中查找完全限定名称。例如,SHOW 插件的完全限定名称是 manticoresoftware/buddy-plugin-show。
ENABLE BUDDY PLUGIN <username/package name on https://packagist.org/>
注意:
ENABLE BUDDY PLUGIN需要 Manticore Buddy。如果无法使用,请确保已安装 Buddy。
此命令重新激活先前禁用的 Buddy 插件,使其能够再次处理您的请求。
- SQL
ENABLE BUDDY PLUGIN manticoresoftware/buddy-plugin-showRELOAD PLUGINS FROM SONAME 'plugin_library'
从给定的库重新加载所有插件(UDF、排序器等)。从某种意义上说,重新加载过程是事务性的,确保:
- 所有插件都成功更新到它们的新版本;
- 更新是原子的,意味着所有插件同时被替换。此原子性确保使用重新加载库中多个函数的查询永远不会混用旧版本和新版本。
在 RELOAD 期间,插件集合保证是一致的;它们要么全部是旧的,要么全部是新的。
重新加载过程也是无缝的,因为某个版本的重新加载插件将始终可用于并发查询,没有任何临时中断。这比使用一对 DROP 和 CREATE 语句重新加载要好得多。使用后者,在 DROP 和随后的 CREATE 之间存在一个短暂的窗口期,在此期间查询技术上引用的是未知插件,因此会失败。
如果发生任何失败,RELOAD PLUGINS 不执行任何操作,保留旧插件,并报告错误。
在 Windows 上,覆盖或删除当前正在使用的 DLL 库可能会有问题。但是,您仍然可以重命名它,将新版本放在旧名称下,然后 RELOAD 将起作用。成功重新加载后,您还可以删除重命名的旧库。
mysql> RELOAD PLUGINS FROM SONAME 'udfexample.dll';
Query OK, 0 rows affected (0.00 sec)
Ranker 插件允许您实现一个自定义的 ranker,该 ranker 接收文档中匹配的所有关键词出现,并计算一个 WEIGHT() 值。它们可以按如下方式调用:
SELECT id, attr1 FROM test WHERE match('hello') OPTION ranker=myranker('option1=1');
调用流程如下:
XXX_init()在每个查询每个表开始时调用一次。通过SPH_RANKER_INIT结构传递多个查询范围的选项,包括用户选项字符串(例如,上面示例中的 "option1=1")。XXX_update()对每个匹配的文档调用多次,每次传入一个匹配的关键词出现,作为其参数,即SPH_RANKER_HIT结构。保证每个文档内的出现按hit->hit_pos值升序传递。XXX_finalize()在没有更多关键词出现时,对每个匹配的文档调用一次。它必须返回WEIGHT()值。此函数是唯一必需的。XXX_deinit()在每个查询结束时调用一次。
令牌过滤器插件允许您实现一个自定义的分词器,根据自定义规则创建令牌。有两种类型:
- 由表设置中的 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()在查询处理结束时调用。
缺少这些函数是允许的。