【问题标题】:How to sort mysql search result by relevance?如何按相关性对mysql搜索结果进行排序?
【发布时间】:2011-11-26 19:38:41
【问题描述】:

我有一个与此问题类似的问题

MySQL - How to ORDER BY RELEVANCE? INNODB Table

不同的是,这里我要从5个字段中搜索为

add1、add2、add3、post_town、post_code

并且只有 post_code 字段中的记录不会为空,其他字段的记录在某些地方可能为空。如果我搜索关键字 kingston,它会返回

Acre Road, Kingston upon Thames, KT2 6EA

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

这些结果是所有字段的组合add1、add2、add3、post_town、post_code

我需要这个结果按照以下顺序

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

Acre Road, Kingston upon Thames, KT2 6EA

我当前的 SQL 查询是这样的

SELECT add1, add2, add3, post_town, post_code FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
OR add2 LIKE '%".$keyword."%'
OR add3 LIKE '%".$keyword."%'
OR post_town LIKE '%".$keyword."%'
OR post_code LIKE '%".$keyword."%'

所以我需要以搜索关键字开头的记录将首先出现。我该怎么做?

【问题讨论】:

    标签: mysql search relevance


    【解决方案1】:

    为什么不使用查询选择最小的合格结果,并在脚本中使用自己的逻辑来为您的结果提供预先排名权重并相应地对它们进行排序?

    这将帮助您:

    1. 有更复杂的排名标准,在查询中可能会也可能不会。

    2. 如果您的排名标准发生变化,请不要编辑 sql 查询。

    【讨论】:

    • 同意。我不禁觉得这是最好在 SQL 查询之外解决的问题
    【解决方案2】:

    对于基于相关性的排序,FULL TEXT SEARCH 是更可靠的选项。

    FULL TEXT SEARCH 使用了基于搜索词出现次数的相关性,这些词可以稍后用于 ORDER 返回的结果。

    【讨论】:

      【解决方案3】:

      不是最漂亮的,但应该可以!

      select a.* from (
      SELECT add1, add2, add3, post_town, post_code, 1 as rank FROM address_mst 
      WHERE add1 LIKE '%".$keyword."%'
      UNION
      SELECT add1, add2, add3, post_town, post_code, 2 as rank FROM address_mst 
      WHERE add2 LIKE '%".$keyword."%'
      UNION
      SELECT add1, add2, add3, post_town, post_code, 3 as rank FROM address_mst 
      WHERE add3 LIKE '%".$keyword."%'
      UNION
      SELECT add1, add2, add3, post_town, post_code, 4 as rank FROM address_mst 
      WHERE post_town LIKE '%".$keyword."%'
      UNION
      SELECT add1, add2, add3, post_town, post_code, 5 as rank FROM address_mst 
      WHERE post_code LIKE '%".$keyword."%'
      ) a
      order by a.rank asc;
      

      【讨论】:

      • 非常感谢,这确实有效。只是在最后一行做了一个修改,以通过 a.rank asc、add1、add2、add3、post_town、post_code 看起来更智能的顺序;
      猜你喜欢
      • 2010-11-04
      • 2012-01-28
      • 2014-05-24
      • 2020-09-03
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多