简单的 Sphinx & mySQL 查询

Simple Sphinx & mySQL Query

请原谅我问了一个简单的问题,但我对 Sphinx 完全陌生。

我正在使用带有 mySQL 数据存储的 Sphinx。 table 如下所示,标题和内容字段由 Sphinx 索引。

CREATE TABLE `documents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_id` int(11) NOT NULL,
  `group_id2` int(11) NOT NULL,
  `date_added` datetime NOT NULL,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `url` varchar(255) NOT NULL,
  `links` int(11) NOT NULL,
  `hosts` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB AUTO_INCREMENT=439043 DEFAULT CHARSET=latin1

现在,如果我通过 Sphinx 连接

mysql -h0 -P9306

我可以 运行 一个简单的查询,例如...

SELECT * FROM test1 WHERE MATCH('test document');

我会得到一个结果集,例如...

+--------+----------+------------+
| id     | group_id | date_added |
+--------+----------+------------+
| 360625 |        1 | 1499727792 |
| 362257 |        1 | 1499727807 |
| 362777 |        1 | 1499727811 |
| 159717 |        1 | 1499717614 |
| 160557 |        1 | 1499717621 |
----------------------------------

当我真正想要的是 return 一个包含来自文档 table 的列值的结果集(例如 URL、标题、链接、主机等列) 并且,如果可能的话,按照 Sphinx 匹配的相关性对这些进行排序。

这可以在单个查询中完成吗?它会是什么样子?

提前致谢!

两个(主要)选项

  1. 从 SphinxQL 结果中提取 ids,然后 运行 一个 MySQL 查询以获取完整的详细信息,请参阅 http://sphinxsearch.com/info/faq/#row-storage 例如 SELECT * FROM documents WHERE id IN (3,5,7) ORDER BY FIELD(id,3,5,7) 这个 MySQL 查询应该非常快,因为它是一个 PK 查找,并且只检索几行(即一页结果)- 搜索整个 table 的繁重工作已经完成第一个 Sphinx 查询。

  2. 将要在结果集中检索的所有列复制为 Attributes。您已经已经制作了group_iddate_added作为属性,需要制作更多属性。

    sql_field_string 是一个非常方便的快捷方式,可以从一列中创建一个 Field 和一个 String Attribute。不适用于其他列类型,但不太有用,因为数字列通常不需要作为字段。

选项 1 很好,因为它避免了重复数据,并节省内存(Sphinx 通常希望在内存中保存属性)- 并且可能在大数据集上最实用。

而选项 2 的好处在于它避免了对每个结果进行第二次查询。但是因为有数据的副本,这可能意味着额外的复杂同步。

  • 在你的情况下看起来不相关,但如果说有一个 'clicks' 列,你希望它经常增加(当用户点击时!),并且在结果集中需要它但你真的不在 sphinx 中需要它用于查询目的,第一个选项将允许您只需要在数据库中递增它,并且 mysql 查询将始终获得实时值。但是第二个选项意味着必须始终将 sphinx 索引保持在 'sync')