每个用户结果排序的可扩展全文搜索

时间:2010-05-06 14:21:39

标签: mysql search full-text-search lucene sphinx

有哪些选项可用于创建可扩展的全文搜索,其结果需要按用户进行排序?这适用于PHP / MySQL(Symfony / Doctrine,如果相关的话)。

在我们的案例中,我们有一个由用户执行的锻炼数据库。用户之前完成的锻炼应显示在结果的顶部。他们进行锻炼的次数越多,搜索匹配就越高。如果有帮助,您可以假设我们知道用户提前完成锻炼的次数。

可能的解决方案

Sphinx - 使用Sphinx实现全文搜索,在MySQL中进行所有查询和排序。这似乎很有希望(并且有一个Symfony插件!)但我对此并不了解。

Lucene - 使用Lucene执行全文搜索并将用户的完成放入查询中。正如this Stack Overflow thread中所建议的那样。或者,使用Lucene检索结果,然后在PHP中重新排序。但是,由于用户可能已经完成了数百次锻炼,因此这两种解决方案看起来都很笨拙且可能无法扩展。

Mysql - 没有原生全文支持(InnoDB),所以我们使用LIKE或REGEX,这是不可扩展的。

2 个答案:

答案 0 :(得分:2)

MySQL确实拥有原生FULLTEXT支持,但仅限于MyISAM表。

对于大多数实际任务,Sphinx是最快的引擎。但是,它是一个外部索引,因此只能使用cron脚本及时更新。

通过使用SphinxSEMySQL的可插入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服务器发出添加/更新/删除请求。