在我的应用中,用户可以收藏文档。 Sphinx用于允许他们搜索匹配的文档。如果用户想要搜索他们的收藏夹,我首先直接访问数据库(mySQL)以获取文档ID列表并使用它来过滤sphinx中的搜索。伪代码看起来像这样:
function searchFavoritesForUser($userId, $query) {
$favoriteIds = getFavoriteIdsForUser($userId);
$sphinx = new Sphinx(...);
$sphinx->setFilter('document_id', $favoriteIds);
return $sphinx->search($query);
}
如果用户拥有合理数量的收藏夹,则此工作正常。如果用户拥有大量收藏夹,则加载收藏夹可能会占用大量内存,并且在sphinx中设置过滤器可能会在searchd
中再次运行various limits。
我意识到我可以调整这些配置值,但似乎必须有更好的方法来设计它。理想情况下,我可以消除我必须将数据库中所有喜欢的文档ID加载到主内存中的步骤。
答案 0 :(得分:1)
在创建sphinx索引时,您可以为sphinx中的收藏夹(doc_id,user_id)创建MVA (multi-value attribute)
,然后直接在sphinx中搜索,无需查询MySql。