简单的 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 匹配的相关性对这些进行排序。
这可以在单个查询中完成吗?它会是什么样子?
提前致谢!
两个(主要)选项
从 SphinxQL 结果中提取 id
s,然后 运行 一个 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 查询。
将要在结果集中检索的所有列复制为 Attributes。您已经已经制作了group_id
和date_added
作为属性,需要制作更多属性。
sql_field_string
是一个非常方便的快捷方式,可以从一列中创建一个 Field 和一个 String Attribute。不适用于其他列类型,但不太有用,因为数字列通常不需要作为字段。
选项 1 很好,因为它避免了重复数据,并节省内存(Sphinx 通常希望在内存中保存属性)- 并且可能在大数据集上最实用。
而选项 2 的好处在于它避免了对每个结果进行第二次查询。但是因为有数据的副本,这可能意味着额外的复杂同步。
- 在你的情况下看起来不相关,但如果说有一个 'clicks' 列,你希望它经常增加(当用户点击时!),并且在结果集中需要它但你真的不在 sphinx 中需要它用于查询目的,第一个选项将允许您只需要在数据库中递增它,并且 mysql 查询将始终获得实时值。但是第二个选项意味着必须始终将 sphinx 索引保持在 'sync')
请原谅我问了一个简单的问题,但我对 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 匹配的相关性对这些进行排序。
这可以在单个查询中完成吗?它会是什么样子?
提前致谢!
两个(主要)选项
从 SphinxQL 结果中提取
id
s,然后 运行 一个 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 查询。将要在结果集中检索的所有列复制为 Attributes。您已经已经制作了
group_id
和date_added
作为属性,需要制作更多属性。sql_field_string
是一个非常方便的快捷方式,可以从一列中创建一个 Field 和一个 String Attribute。不适用于其他列类型,但不太有用,因为数字列通常不需要作为字段。
选项 1 很好,因为它避免了重复数据,并节省内存(Sphinx 通常希望在内存中保存属性)- 并且可能在大数据集上最实用。
而选项 2 的好处在于它避免了对每个结果进行第二次查询。但是因为有数据的副本,这可能意味着额外的复杂同步。
- 在你的情况下看起来不相关,但如果说有一个 'clicks' 列,你希望它经常增加(当用户点击时!),并且在结果集中需要它但你真的不在 sphinx 中需要它用于查询目的,第一个选项将允许您只需要在数据库中递增它,并且 mysql 查询将始终获得实时值。但是第二个选项意味着必须始终将 sphinx 索引保持在 'sync')