一尘不染

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

mysql

这是我想做的:

  • 使搜索主题与表格中的多个字段匹配
  • 根据字段的重要性和匹配的相关性对结果进行排序(按该顺序)

例如:假设我有一个博客。然后有人搜索“ php”。结果将显示为:

  • 首先,针对“标题”字段的匹配,按相关性排序
  • 然后,根据相关性对“ body”字段进行匹配
  • 以此类推,以指定的字段…

我实际上是用PHP中的类完成此操作的,但是它使用了大量的UNIONS(很多!),并且随着搜索主题的大小而增长。因此,我担心性能和DOS问题。有人对此有任何线索吗?


阅读 892

收藏
2020-05-17

共1个答案

一尘不染

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

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

它使用选择子查询来提供权重以对结果进行排序。在这种情况下,搜索了三个字段,您可以为每个字段指定权重。它可能比联合会便宜,并且可能只是纯MySQL中更快的方式之一。

如果您有更多数据并且需要更快的结果,则可以考虑使用Sphinx或Lucene之类的东西。

2020-05-17