≫ 扩展

FEDERATED

使用 MySQL 的 FEDERATED 引擎,您可以从 MySQL/MariaDB 连接到本地或远程的 Manticore 实例并执行搜索查询。

使用 FEDERATED

由于 FEDERATED 引擎的限制以及 Manticore 实现了自定义语法(如 MATCH 子句),实际的 Manticore 查询不能直接用于 FEDERATED 引擎,必须通过“代理”(作为列中的字符串发送)。

要通过 FEDERATED 进行搜索,首先需要创建一个 FEDERATED 引擎表。Manticore 查询将包含在对 FEDERATED 表执行的 SELECT 中的 query 列中。

创建一个兼容 FEDERATED 的 MySQL 表:

‹›
  • SQL
SQL
📋
CREATE TABLE t1
(
    id          INTEGER UNSIGNED NOT NULL,
    year        INTEGER NOT NULL,
    rating      FLOAT,
    query       VARCHAR(1024) NOT NULL,
    INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://FEDERATED@127.0.0.1:9306/DB/movies';
‹›
Response
Query OK, 0 rows affected (0.00 sec)

查询兼容 FEDERATED 的表:

‹›
  • SQL
SQL
📋
SELECT * FROM t1 WHERE query='SELECT * FROM movies WHERE MATCH (\'pie\')';
‹›
Response
+----+------+--------+------------------------------------------+
| id | year | rating | query                                    |
+----+------+--------+------------------------------------------+
|  1 | 2019 |      5 | SELECT * FROM movies WHERE MATCH ('pie') |
+----+------+--------+------------------------------------------+
1 row in set (0.04 sec)

唯一固定的映射是 query 列。它是必需的,并且必须是唯一附加表的列。

通过 FEDERATED 连接的 Manticore 表必须是物理表(普通表或实时表)。

FEDERATED 表应具有与远程 Manticore 表属性同名的列,因为它们将按名称绑定到 Manticore 结果集中提供的属性。然而,它可能只映射部分属性,而非全部。

Manticore 服务器通过用户名 "FEDERATED" 识别来自 FEDERATED 客户端的查询。CONNECTION 字符串参数用于指定 Manticore 主机、SQL 端口和通过连接进行查询的表。连接字符串语法如下:

CONNECTION="mysql://FEDERATED@HOST:PORT/DB/TABLENAME"

由于 Manticore 没有数据库的概念,DB 字符串可以是任意的,因为 Manticore 会忽略它,但 MySQL 要求在 CONNECTION 字符串定义中必须有值。如示例所示,完整的 SELECT SQL 查询应放在针对 query 列的 WHERE 子句中。

仅支持 SELECT 语句,不支持 INSERTREPLACEUPDATEDELETE

FEDERATED 提示

一个非常重要的注意事项是,让 Manticore 执行排序、过滤和结果集切片要远远比增加最大匹配数并在 MySQL 端使用 WHERE、ORDER BY 和 LIMIT 子句更高效。原因有两个。首先,Manticore 实现了多种优化,执行这些任务的性能优于 MySQL。其次,搜索守护进程(searchd)需要打包、传输和解包的数据量更少。

可以在 FEDERATED 表和其他 MySQL 表之间执行 JOIN。这可以用来检索未存储在 Manticore 表中的信息。

‹›
  • SQL
SQL
📋
将基于 MySQL 的表与由 Manticore 提供服务的 FEDERATED 表进行 JOIN 的查询:
SELECT t1.id, t1.year, comments.comment FROM t1 JOIN comments ON t1.id=comments.post_id WHERE query='SELECT * FROM movies WHERE MATCH (\'pie\')';
‹›
Response
+----+------+--------------+
| id | year | comment      |
+----+------+--------------+
|  1 | 2019 | was not good |
+----+------+--------------+
1 row in set (0.00 sec)
Last modified: August 28, 2025