在mysql中对多个字段进行加权搜索的最佳方法?

Hug*_*ota 22 php mysql search

这是我想要做的:

  • 匹配搜索主题与我的表的多个字段
  • 按字段的重要性和匹配的相关性(按此顺序)排序结果

例如:我们假设我有一个博客.然后有人搜索"php".结果会这样:

  • 首先,字段'title'的匹配,按相关性排序
  • 然后,字段'body'的匹配也按相关性排序
  • 等等与指定的字段...

我实际上用PHP中的一个类做了这个,但它使用了很多UNIONS(很多!)并且随着搜索主题的大小而增长.所以我担心性能和DOS问题.有没有人对此有所了解?

hak*_*kre 36

这种加权搜索/结果的方法可能适合您:

SELECT *,
    IF(
            `name` LIKE "searchterm%",  20, 
         IF(`name` LIKE "%searchterm%", 10, 0)
      )
      + IF(`description` LIKE "%searchterm%", 5,  0)
      + IF(`url`         LIKE "%searchterm%", 1,  0)
    AS `weight`
FROM `myTable`
WHERE (
    `name` LIKE "%searchterm%" 
    OR `description` LIKE "%searchterm%"
    OR `url`         LIKE "%searchterm%"
)
ORDER BY `weight` DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)

它使用select子查询来提供排序结果的权重.在这种情况下,搜索了三个字段,您可以指定每个字段的权重.它可能比工会便宜,而且可能只是普通MySQL中更快的方法之一.

如果你有更多的数据并且需要更快的结果,你可以考虑使用像Sphinx或Lucene这样的东西.

  • 基本上它是一个IF函数,如果条件(第一个参数)为真,则使用第二个参数(权重),否则将使用第三个参数(0-weight).该手册包含所有详细信息:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if (4认同)

dqh*_*cks 9

你可以将多个mysql MATCH()值一起添加,首先将每个值乘以它们的权重.

简化当然......

'(MATCH(column1) AGAINST(\''.$_GET['search_string'].'\') * '.$column1_weight.')
 + (MATCH(column2) AGAINST(\''.$_GET['search_string'].'\') * '.$column2_weight.')
 + (MATCH(column3) AGAINST(\''.$_GET['search_string'].'\') * '.$column3_weight.')
 AS relevance'
Run Code Online (Sandbox Code Playgroud)

然后

'ORDER BY relevance'
Run Code Online (Sandbox Code Playgroud)