我正在尝试使用单个Sphinx请求实现两个目标:获取与查询中的任何单词匹配的结果,并在第一个位置具有完全匹配。 例如,如果我有歌曲搜索请求数据库:
两个测试查询:
如果我搜索“Miley Cyrus”,我想获得第3行,如果我搜索“Miley Cyrus Wrecking Ball”,我想获得#1或#2。我尝试了匹配和排名模式的不同组合,但仍无法使用单个请求。当我尝试SPH_MATCH_EXTENDED2
和SPH_RANK_SPH04
时,我的第一个测试查询在第一个位置正常返回结果#3,但第二个测试查询没有返回任何结果。当我尝试SPH_MATCH_ANY
时,我得到第二个测试查询的部分匹配结果(#2的权重稍高,看起来是正确的)但是第一个查询返回3行具有相同的权重,#1位于顶部,因为在DB中订购。我现在唯一的解决方法是进行两个查询:一个用于完全匹配,另一个用于部分匹配(如果第一个失败)。
同样从这个article我看到除了SPH_MATCH_EXTENDED2
之外的所有匹配模式都是遗留的,那么当它们被删除时,我应该如何使用上面的例子进行部分匹配?
答案 0 :(得分:2)
<强> TD组成; dr 强> 只有一个匹配模式 - 扩展。 不要使用任何其他人。如果要修改包含的文档,修改查询本身(例如,使用仲裁运算符)。然后可以使用排名模式选择文档的订购方式。
首先要意识到,匹配和排名是两个截然不同的主题。
匹配是文件甚至出现在哪些结果中,即比较查询并对“这个文档是否与查询匹配?”这一问题说“是/否”。
排名是计算权重,因此最佳匹配可以按重量排序升至最高位置。
历史匹配和排名合并为一个概念,您选择匹配模式(选择查询的方式),并自动选择合适的排名计算。
这意味着不够灵活,所以分开。但是很多人使用旧的行为,所以旧的匹配模式(任何/短语等)由于兼容性原因而维护。
内部只有一种匹配模式 - 扩展。较旧的传统匹配模式,根据需要自动重写查询(将其更改为扩展查询语法),并选择特定的排名模式。
因此,通过保持扩展匹配模式,您可以选择自己的排名模式。因此可以独立选择匹配(修改查询)或排名行为。
我解释了所有的背景故事,告诉你如果提供的匹配模式不够好,你可以做同样的事情。即
您需要选择特定的排名模式(甚至通过排名表达式选择完全自定义的排名模式)
您可能需要修改查询本身,以更改匹配行为。 (记得选择MATCH_ANY,更改查询并选择排名模式。)
因此可以重写查询以使用仲裁,例如
"Miley Cyrus Wrecking Ball"/2
记住保持扩展匹配模式。然后可以独立选择排名模式(setRankingMode) - 例如现在可以使用SPH_RANK_SPH04,但你做获得'模糊'匹配行为(就像匹配任何一样)
...别忘了尝试其他排名模式。