【问题标题】:Sphinx exact/partial match and rankingSphinx 完全/部分匹配和排名
【发布时间】:2014-02-01 11:58:40
【问题描述】:

我试图通过单个 Sphinx 请求实现两个目标:获取与查询中的任何单词匹配的结果,并且首先具有完全匹配。 例如,如果我有歌曲搜索请求数据库:

  1. 麦莉·赛勒斯·鲍尔
  2. 麦莉赛勒斯破坏
  3. 麦莉·赛勒斯

还有两个测试查询:

  1. 麦莉·赛勒斯
  2. 麦莉赛勒斯破坏球

如果我搜索“麦莉赛勒斯”,我想得到第 3 行,如果我搜索“麦莉赛勒斯破坏球”,我想得到第 1 或第 2 行。我尝试了匹配和排名模式的不同组合,但仍然无法使用单个请求进行此操作。当我尝试SPH_MATCH_EXTENDED2SPH_RANK_SPH04 时,我的第一个测试查询工作正常,首先返回结果#3,但第二个测试查询没有返回任何结果。当我尝试SPH_MATCH_ANY 时,我得到第二个测试查询的部分匹配结果(#2 的权重稍高,这似乎是正确的),但第一个查询返回 3 行具有相同权重,并且 #1 由于顺序而位于顶部数据库。我现在唯一的解决方法是进行两个查询:一个用于完全匹配,另一个用于部分匹配,如果第一个失败。

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

【问题讨论】:

    标签: php sphinx


    【解决方案1】:

    td;dr 只有一种 匹配 模式 - 扩展。 不要使用任何其他。如果您想修改包含的文档,修改查询本身(例如,使用 quorum 运算符)。然后可以使用 Ranking 模式选择文档的排序方式。


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

    • 匹配是什么文档甚至呈现结果,即比较查询并对“此文档是否与查询匹配?”的问题说是/否。

    • 排名是计算权重,因此最佳匹配可以通过按权重排序升到顶部。

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

    这意识到不够灵活,所以在哪里分开。但是很多人使用旧的行为,因此出于兼容性原因维护旧的匹配模式(任何/短语等)。

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

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


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

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

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

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

    "Miley Cyrus Wrecking Ball"/2
    

    记得保持扩展匹配模式。然后可以独立选择排名模式 (setRankingMode) - 例如现在可以使用 SPH_RANK_SPH04,但您确实会得到“模糊”匹配行为(就像匹配任何一样)

    ...不要忘记尝试其他排名模式。

    【讨论】:

    • 感谢您的精彩而详细的回答,我应该更好地阅读文档,对扩展查询语法知之甚少,quorum 运算符做到了。
    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2020-01-20
    • 2012-03-26
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多