有哪些选项可用于创建可扩展的全文搜索,其结果需要按用户进行排序?这适用于PHP / MySQL(Symfony / Doctrine,如果相关的话)。
在我们的案例中,我们有一个由用户执行的锻炼数据库。用户之前完成的锻炼应显示在结果的顶部。他们进行锻炼的次数越多,搜索匹配就越高。如果有帮助,您可以假设我们知道用户提前完成锻炼的次数。
可能的解决方案
Sphinx - 使用Sphinx实现全文搜索,在MySQL中进行所有查询和排序。这似乎很有希望(并且有一个Symfony插件!)但我对此并不了解。
Lucene - 使用Lucene执行全文搜索并将用户的完成放入查询中。正如this Stack Overflow thread中所建议的那样。或者,使用Lucene检索结果,然后在PHP中重新排序。但是,由于用户可能已经完成了数百次锻炼,因此这两种解决方案看起来都很笨拙且可能无法扩展。
Mysql - 没有原生全文支持(InnoDB),所以我们使用LIKE或REGEX,这是不可扩展的。
答案 0 :(得分:2)
MySQL
确实拥有原生FULLTEXT
支持,但仅限于MyISAM
表。
对于大多数实际任务,Sphinx
是最快的引擎。但是,它是一个外部索引,因此只能使用cron脚本及时更新。
通过使用SphinxSE
(MySQL
的可插入Sphinx
接口),您可以在一个查询中加入MySQL
表和Sphinx
索引。但是,更新仍需要外部脚本。
由于执行的锻炼次数似乎经常变化,因此将其保留在Sphinx
中需要花费太多精力来重建索引。
使用SphinxSE
,您可以编写类似于以下内容的查询:
SELECT *
FROM workouts w
JOIN user_workouts uw
ON uw.workout = w.id
WHERE w.query = 'query query query;filter=user_id,$user_id'
AND uw.user = $user_id
ORDER BY
uw.times_performed DESC
答案 1 :(得分:0)
我不确定你为什么假设使用Lucene是不可扩展的。每个用户数百次锻炼并不需要处理很多数据。
尝试使用Solr / Lucene作为搜索后端。它有一个JSON / XML接口,可以很好地与你的PHP前端配合使用。将用户完成的锻炼#存储在数据库表中。发出查询时,从Solr获取结果,您可以从PHP代码中选择数据库表和求助。应该足够快速和可扩展。使用Solr,保持索引简单易行;只需向Solr服务器发出添加/更新/删除请求。