狮身人面像精确/部分匹配和排名

时间:2014-02-01 11:58:40

标签: php sphinx

我正在尝试使用单个Sphinx请求实现两个目标:获取与查询中的任何单词匹配的结果,并在第一个位置具有完全匹配。 例如,如果我有歌曲搜索请求数据库:

  1. Miley Cyrus Ball
  2. Miley Cyrus Wrecking
  3. Miley Cyrus
  4. 两个测试查询:

    1. Miley Cyrus
    2. Miley Cyrus Wrecking Ball
    3. 如果我搜索“Miley Cyrus”,我想获得第3行,如果我搜索“Miley Cyrus Wrecking Ball”,我想获得#1或#2。我尝试了匹配和排名模式的不同组合,但仍无法使用单个请求。当我尝试SPH_MATCH_EXTENDED2SPH_RANK_SPH04时,我的第一个测试查询在第一个位置正常返回结果#3,但第二个测试查询没有返回任何结果。当我尝试SPH_MATCH_ANY时,我得到第二个测试查询的部分匹配结果(#2的权重稍高,看起来是正确的)但是第一个查询返回3行具有相同的权重,#1位于顶部,因为在DB中订购。我现在唯一的解决方法是进行两个查询:一个用于完全匹配,另一个用于部分匹配(如果第一个失败)。

      同样从这个article我看到除了SPH_MATCH_EXTENDED2之外的所有匹配模式都是遗留的,那么当它们被删除时,我应该如何使用上面的例子进行部分匹配?

1 个答案:

答案 0 :(得分:2)

<强> TD组成; dr 只有一个匹配模式 - 扩展。 不要使用任何其他人。如果要修改包含的文档,修改查询本身(例如,使用仲裁运算符)。然后可以使用排名模式选择文档的订购方式。


首先要意识到,匹配和排名是两个截然不同的主题。

  • 匹配是文件甚至出现在哪些结果中,即比较查询并对“这个文档是否与查询匹配?”这一问题说“是/否”。

  • 排名是计算权重,因此最佳匹配可以按重量排序升至最高位置。

历史匹配和排名合并为一个概念,您选择匹配模式(选择查询的方式),并自动选择合适的排名计算。

这意味着不够灵活,所以分开。但是很多人使用旧的行为,所以旧的匹配模式(任何/短语等)由于兼容性原因而维护。

内部只有一种匹配模式 - 扩展。较旧的传统匹配模式,根据需要自动重写查询(将其更改为扩展查询语法),并选择特定的排名模式。

因此,通过保持扩展匹配模式,您可以选择自己的排名模式。因此可以独立选择匹配(修改查询)或排名行为。


我解释了所有的背景故事,告诉你如果提供的匹配模式不够好,你可以做同样的事情。即

  • 您需要选择特定的排名模式(甚至通过排名表达式选择完全自定义的排名模式)

  • 您可能需要修改查询本身,以更改匹配行为。 (记得选择MATCH_ANY,更改查询并选择排名模式。)

因此可以重写查询以使用仲裁,例如

"Miley Cyrus Wrecking Ball"/2

记住保持扩展匹配模式。然后可以独立选择排名模式(setRankingMode) - 例如现在可以使用SPH_RANK_SPH04,但你获得'模糊'匹配行为(就像匹配任何一样)

...别忘了尝试其他排名模式。