从 SphinxSE 到 FEDERATED

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

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 中添加所需的列并执行所需的操作。

FEDERATED 表定义中使用的 Manticore 索引必须是具有存储(plain 或 RealTime)的索引。

文本高亮

使用 FEDERATED 可以对仅存储在 MySQL 中的文本执行片段提取。设置需要一个辅助 FEDERATED 表,用于执行带有 SNIPPET 函数的 SELECT。我们将考虑一个使用维基百科文章的示例,我们只想获取文章 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)连接。连接的 SELECT 中的 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 | New England <b>town</b>                                  |
| 225879601 | <b>Town</b> meeting                                      |
| 227372942 | Huddersfield <b>Town</b> F.C.                            |
| 227789260 | Cape <b>Town</b>                                         |
| 228005065 | Lincoln <b>Town</b> Car                                  |
| 228031371 | Swindon <b>Town</b> F.C.                                 |
| 228037958 | Newburgh (<b>town</b>), New York                         |
| 209273335 | Lewiston (<b>town</b>), New York                         |
| 218353936 | List of Cape <b>Town</b> suburbs                         |
| 218900544 | New <b>Town</b>, Prague                                  |
| 219113587 | History of Swindon <b>Town</b> F.C.                      |
| 221331452 | Chrysler <b>Town</b> and Country                         |
| 222331137 | List of Ipswich <b>Town</b> F.C. statistics and records  |
| 225807671 | East Hampton (<b>town</b>), New York                     |
| 226345846 | Old <b>Town</b>                                          |
| 226474919 | Sengkang New <b>Town</b>                                 |
| 227031418 | Camden <b>Town</b>                                       |
| 227043533 | List of <b>town</b> tramway systems in the United States |
| 227328024 | Ghost <b>town</b>                                        |
| 227337559 | <b>Town</b>                                              |
+-----------+----------------------------------------------------------+
20 rows in set (0.01 sec)

欲了解更多信息,请查看官方文档中的 FEDERATED 支持页面

安装Manticore Search

安装Manticore Search