原谅我问什么应该是一个简单的问题,但我对Sphinx来说是全新的。
我正在使用Sphinx和mySQL数据存储区。该表如下所示,标题和内容字段由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 |
----------------------------------
当我真正想要的是它返回一个带有文档表中列值的结果集(如URL,标题,链接,主机等列),如果可能的话,按照相关性对它们进行排序。狮身人面像比赛。
可以在一个查询中完成吗?它看起来像什么?
提前致谢!
答案 0 :(得分:1)
两个(主要)选项
从SphinxQL结果中获取id
,并运行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查找,只检索几行(即一页结果) - 在第一次Sphinx查询中已经完成了搜索整个表的繁重工作。
将要在结果集中检索的所有列复制为属性。您已经制作group_id
和date_added
作为属性,需要制作更多属性。
sql_field_string
是一个非常方便的快捷方式,可以从一列中选择字段和字符串属性。不适用于其他列类型,但不太有用,因为数字列通常不需要作为字段。
选项1是好的,它可以避免重复数据,并节省内存(Sphinx通常希望在内存中保存属性) - 并且可能在大数据集上最实用。
而选项2的优点在于它避免了对每个结果的第二次查询。但由于有数据副本,可能意味着额外的复杂同步。