大多数性能问题都可以通过改变使用 sphinx 的方式来解决。首先,您需要解决如何索引 sphinx 中的数据。在索引期间进行一些处理将使搜索更快并且结果更相关。其次,处理搜索词,最后但并非最不重要的是,决定要使用的排名算法。
我将使用“标题”字段作为示例,但可以为所有字段复制逻辑。
索引
向 sphinx 添加两个字段(“title”和“title_synonyms”)。对于数据库中的每条记录,请执行以下操作:-
对单词执行 DISTINCT 以删除重复项(“Ruby Developer / Java Developer”将变为“Ruby Developer / Java”。这将阻止记录在搜索时获得两个重复分数。这进入“title”
从上面取 DISTINCT 标题并将所有单词替换为其扩展的同义词等效项。我建议将同义词放在数据库中以使扩展更容易。然后文本将变为“Ruby Developer / Java-EE”。每个单词都必须替换为所有同义词。如果 Java 有两个同义词,则它们都必须在该字段中。这进入“title_synonyms”
搜索
因为现在 sphinx 中有两个字段,我们可以给它们分别赋予不同的权重;“title”可以获得“10”的权重,“title_synonyms”可以获得“3”的权重。这意味着一条记录必须匹配 4 个同义词才能排名高于原始标题的一个。您可以根据自己的需要调整重量。
假设用户正在搜索“Java Developer”。对于搜索短语,请执行以下操作:-
- 删除重复的单词
- 获取搜索词组中每个单词的同义词
- 将 Sphinx 中的匹配模式设置为 SPH_MATCH_EXTENDED
上述规则将意味着 sphinx 中的搜索如下所示:-
@title "Java 开发者" | @title_synonyms "Java-EE"
如果您想对精确匹配进行排名高于词位,则搜索查询将如下所示:-
@title ("Java 开发者" | "=Java =开发者") | @title_synonyms ("Java-EE" | "=Java-EE")
您将需要使用 SPH_RANK_PROXIMITY_BM25 或 SPH_RANK_SPH04 才能使其正常工作。
排行
您可以尝试任何内置的排名算法,看看结果如何。我推荐 SPH_RANK_MATCHENY 或 SPH_RANK_WORDCOUNT 作为开始。
对于接近度和精确匹配排名,请使用 SPH_RANK_PROXIMITY_BM25、SPH_RANK_SPH04 或 SPH_RANK_EXPR,您可以在其中使用自己的算法。
结论
您现在应该有一个既快速又准确的搜索。Ruby 应用程序需要做的工作很少,大部分工作都在 sphinx 中完成(它应该在哪里)。
希望这可以帮助...