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

标签 php mysql search

这是我想做的:

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

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

  • 首先,“标题”字段的匹配项,按相关性排序
  • 然后,字段“body”的匹配项也按相关性排序
  • 等等指定字段...

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

最佳答案

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

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 这样的东西。

关于php - 对mysql中的多个字段进行加权搜索的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496866/

相关文章:

php - 无法使用 max_filesize 发布表单

c - 在 C 中搜索整数数组中的最大数字

java - 在 HashSet 中搜索字符串数组中的任意元素

php - 如何知道存储过程是否引发异常?

SQL 文本搜索和排序

php - preg_match - 只允许一个破折号

php - 更新时查询为空

php - 与 MySQL 的交易?

mysql - 如何对简单调查的结果进行建模?

php - 表单未将数据发送到数据库?