从 SphinxSE 到 FEDERATED

在本文中,我们讨论使用 SphinxSE 和 FEDERATED 引擎与 Manticore Search 之间的差异。

SphinxSE MySQL 插件自 Sphinx Search 的第一次公开发布以来就已提供。其目的是允许用户使用相同的 MySQL 连接执行搜索查询。另一个好处是搜索结果可以与另一个 MySQL 表连接,以便进一步筛选/排序或显示搜索结果中不可用的数据。此外,在那时,SphinxQL 还不存在。

SphinxSE 的一个问题是该插件并未包含在所有 MySQL 变种中。目前只有 MariaDB 在其捆绑的插件列表中包含 SphinxSE。使用 MySQL 或 Percona 变体的人需要下载 MySQL 的源代码并编译 SphinxSE 插件,这并不是开箱即用的体验。将 MySQL 升级到较新版本可能需要针对该版本重新编译,这使得事情变得更加复杂。从开发方面来看,维护 SphinxSE 也很痛苦:这需要与 MySQL API 变化保持同步,并且由于它有自己自定义的搜索语法,维护又一个查询解析器。

添加 FEDERATED 支持

最近,我们在 Manticore Search 中 添加了 对在 FEDERATED 引擎表上执行查询的支持。由于 FEDERATED 在所有 MySQL 变种中默认包含,因此不需要特别的设置或编译。您 只需 创建一个链接到 Manticore SphinxQL 的 FEDERATED 表,就可以执行搜索查询。

SphinxSE 要求以特殊格式发送查询,作为以分号分隔的一套参数,如下所示:

WHERE query='test;filter=cat_id,1,5,10;groupby=day:published_ts;fieldweights=title,10,abstract,3,content,1;'

这种语法从未涵盖所有特性,例如进行 GROUP N BY 的能力。

在 FEDERATED 中,查询字符串是完整的 SphinxQL SELECT 命令:

WHERE query='SELECT * FROM test_index WHERE MATCH (\'test\') AND ANY(cat_id) IN (1,5,10 GROUP BY day,published_ts OPTION field_weights=(title=10,abstract=3,content=1)';

除了拥有完整的搜索功能外,SphinxQL 查询还提供了可移植性,使其更容易单独测试(使用 mysql 客户端)。

限制

连接到 Manticore 的 FEDERATED 表使用与 SphinxSE 表类似的架构:有一个用于查询字符串的必需列。要获取搜索结果中的属性值,需要在表中声明列。

有人可能会问为什么不直接运行 SphinxQL 查询,而是将其放在字符串列中。最大的问题是 SphinxQL 具有自定义子句,如 MATCH(),而 MySQL 解析器无法识别。FEDERATED 本身也有一些缺点,例如它忽略 LIMIT 子句。

另一个限制是涉及与 MySQL 表进行连接,以便执行额外的筛选或排序/分组。连接是通过 Manticore 搜索查询提供的结果集完成的。例如,如果您需要执行涉及来自 MySQL 表的列的排序并且需要应用于整个搜索,则整个结果集应从 Manticore 提取。这在处理大型结果时可能是一个问题。最好是在 Manticore 中添加所需列并在 Manticore 中执行所需操作。

在 FEDERATED 表定义中使用的 Manticore 索引必须是带存储的索引(普通或实时)。

文本高亮

使用 FEDERATED,可以对仅存储在 MySQL 中的文本执行片段提取。设置需要一个用于执行 SELECT 的二级 FEDERATED 表,带有 SNIPPET 函数。我们将考虑一个使用维基百科文章的示例,其中我们只想获取文章 ID 和标题(在我们的索引中未存储):

首先,我们声明 FEDERATED 表,其中 WikiSearch 将用于实际搜索,而 WikiSnippet 将用于带有片段提取的 SELECT:

CREATE TABLE WikiSearch
(
    id INTEGER UNSIGNED NOT NULL,
    query VARCHAR(1024) NOT NULL,
    INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://[email protected]:9306/DB/wikipedia';
CREATE TABLE WikiSnippet
(
    id          INTEGER UNSIGNED NOT NULL,
    snippets    VARCHAR(1024) NOT NULL,
    query       VARCHAR(1024) NOT NULL,
    INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://[email protected]:9306/DB/wikipedia';

我们将从 Manticore 上对维基百科索引进行搜索,并将结果与来自 MySQL 的维基百科表(命名为 wikipediaTable)进行连接。连接选择中的 idarticle 将用于对每篇文章执行单独的 SELECT,返回片段。

mysql> SELECT id,
(SELECT snippets FROM WikiSnippet WHERE query=concat('SELECT SNIPPET(\'',a.title,'\',\'town\') AS snippets FROM wikipedia WHERE id=',a.id)) AS snippet
 FROM ( SELECT WikiSearch.id,wikipediaTable.title FROM WikiSearch JOIN wikipediaTable ON WikiSearch.id=content.id WHERE
         query='SELECT id FROM wikipedia WHERE match(\'@title town\')') a;
+-----------+----------------------------------------------------------+
| id        | snippet                                                  |
+-----------+----------------------------------------------------------+
| 221741590 | 新英格兰 <b>town</b>                                   |
| 225879601 | <b>Town</b> 会议                                       |
| 227372942 | 哈德斯菲尔德 <b>Town</b> F.C.                           |
| 227789260 | 开普 <b>Town</b>                                        |
| 228005065 | 林肯 <b>Town</b> 汽车                                   |
| 228031371 | 斯温登 <b></b> 足球俱乐部                                   |
| 228037958 | 纽堡 (<b></b>), 纽约                                |
| 209273335 | 劳伊斯顿 (<b></b>), 纽约                                |
| 218353936 | 开普 <b></b> 郊区列表                                    |
| 218900544 |  <b></b>, 布拉格                                   |
| 219113587 | 斯温登 <b></b> 足球俱乐部历史                        |
| 221331452 | 克莱斯勒 <b></b> 和乡村                               |
| 222331137 | 伊普斯维奇 <b></b> 足球俱乐部统计与记录               |
| 225807671 | 东汉普顿 (<b></b>), 纽约                               |
| 226345846 |  <b></b>                                            |
| 226474919 | 盛港新 <b></b>                                       |
| 227031418 | 卡姆登 <b></b>                                       |
| 227043533 | 美国 <b></b> 有轨电车系统列表                         |
| 227328024 |  <b></b>                                          |
| 227337559 | <b></b>                                            |
+-----------+----------------------------------------------------------+
20 rows in set (0.01 sec)

如需更多信息,请查看官方文档中的 联邦支持页面

安装Manticore Search

安装Manticore Search