6

我正在尝试为我的 MySQL 服务器使用 Sphinx 全文搜索功能。我已经根据安装手册设置了本地 Sphinx 服务,并且能够进行文本搜索。

我可以连接到

mysql.exe --host=127.0.0.1 port=9306

其中 port9306sphinx.conf中配置的端口:

searchd {
...
listen = 9306:mysql41
...
}

并进行SphinxQL查询。我正在使用发布包附带的默认 Sphinx 示例数据库。

但是我想将 Sphinx 与我的 MySQL 服务器集成,这样所有连接到我的 sql 服务器的客户端都可以执行 SphinxQL,我想用 MySQL 示例数据库sakila进行尝试

  • 实现这一目标的步骤是什么?
  • 我需要将数据库引擎从 InnoDB 转换为 Sphinx 吗?
  • 此外,从看起来,Sphinx 只能为每个配置索引一 (1) 个数据库表,我如何确保 MySQL 数据库中的所有表都被索引?
4

1 回答 1

13

但是我想将 Sphinx 与我的 MySQL 服务器集成,这样所有连接到我的 sql 服务器的客户端都可以执行 SphinxQL

不能那样做。Sphinx(当为 sphinxQL 启用时)只是为您提供了一个看起来像 mysql 的服务器 - 即它使用相同的通信协议 - 主要是为了可以重用 mysql 客户端库,而不必为 sphinx 创建一个新的。

它们是不同的“服务器”。您连接到 mysql 服务器以运行 mysql 命令;您连接到 sphinx 服务器以运行 sphinxQL 命令。

应用程序必须分别连接到每个“服务器”。想象一下 sphinx 有点像 postgres,你显然没有连接到 mysql 并期望能够运行 postgresql。

但是有 SphinxSE - 这是一个假的 mysql 存储引擎。您将其安装到 mysql 中,然后您可以使用此引擎创建表。然后你对这个表运行 mysql 查询,引擎盖下是一个正在运行的 sphinx-server。所以对 mysql 来说,它看起来像是一个包含数据的表,这是最有用的,因为可以将这个搜索表与原始数据表“连接”,以在一个 mysql 查询中获取结果和原始数据。

然后应用程序不必连接到 sphinx 本身。SphinxSE 为您完成。

http://sphinxsearch.com/docs/current.html#sphinxse

我需要将数据库引擎从 InnoDB 转换为 Sphinx 吗?

不,您可以使用您喜欢的任何引擎将原始数据保留在原处。Sphinx 只提供一个“索引”——它不存储原始数据*。它本身不是数据库,只是通过高度优化的索引提供快速查询。

基本上,您向 sphinx 询问与某个查询匹配的文档的唯一 ID。然后使用这些 id 来查找数据。SphinxAPI、sphinxSE 和 sphinxQL 只是执行此操作的三种不同机制。

此外,从表面上看,Sphinx 只能为每个配置索引一 (1) 个数据库表,

不可以。一个 sphinx 实例可以托管许多索引。一个索引可以有很多来源。所以只能为每个表创建一个索引。或者如果您主要想一起搜索它们,可以只创建一个合并索引。

-- ** 编辑以回复评论中的问题:**

当你这么说时,sphinx 可以承载许多索引,它是仅依赖于 sphinx.conf 配置文件吗?

您可能会为每个表定义一个 sphinx 索引。因此,每个表都需要一个源/索引对。(除非你想在一个索引中索引所有表,这也是可能的。

它无法读取表本身,并创建配置文件,您必须单独定义每个索引。

当你说“给你一个看起来像 mysql 的服务器”时,你的意思是像一个代理,

不,不是代理。

我的 MySQL 客户端在哪里可以连接到这个 Sphinx 端口并且客户端会认为它是 MySQL 服务器?

基本上是的。客户端将像连接到 mysql-server 一样连接到它。

 如果是这样,那么我可以在同一连接上执行 MySQL SQL 查询和 SphinxQL 吗?

不,不可能。连接到 mysql-server,运行 mysql 查询。连接到 searchd 以运行 sphinxQL 查询。

两个连接,每个服务器一个。

为什么我的 MySQL Workbench 无法连接到端口 9306,

不知道。可能是防火墙问题。

于 2012-07-28T14:48:31.180 回答