【问题标题】:search for multiple values, sort by relevance (php + MySQL, no full text search)搜索多个值,按相关性排序(php + MySQL,无全文搜索)
【发布时间】:2013-08-14 01:37:11
【问题描述】:

我有一个表格,其中包含我想要搜索的标题和关键字列。我想添加使用多词搜索的功能,但它肯定应该按相关性对结果进行排序。 FullTextSearch 不是一个选项,因为我目前使用的是 MySQL5.5 和 innoDB。

我目前的做法如下:

  1. 我单独搜索每个术语并将匹配的 ID 存储在 php 数组中。
  2. 搜索完所有字词后,我会计算 id 出现次数并进行相应排序。

我现在想知道是否有更有效的方法可以做到这一点,因为我主要使用 php。我应该在数据库中做一些这样的处理吗?我应该彻底改变我的方法吗?

该表相对较小(少于 10k 条记录),我预计在不久的将来它不会变得更大。

有什么建议吗?谢谢。

【问题讨论】:

  • 如果您展示代码并提供有关表架构和查询的更多信息,您可能会获得一些帮助。
  • @DevlshOne:我使用的是 Joomla,所以我的数据库交互有点像 pdo,我使用的是 REGEX(一次一个术语),但我可以轻松地将其更改为 LIKE 语句。我只是不想让一些特定的语法妨碍我,我感兴趣的是是否有办法将这些功能中的一些移动到数据库中以便它运行得更快,或者是否有另一种完全不同的方法我应该考虑。不过,谢谢。
  • 看看,也许它会有所帮助:stackoverflow.com/a/35512410/1673161

标签: php mysql performance search search-engine


【解决方案1】:

您可以在 SQL 中进行计数。这是一个例子:

select ((col like 'term1') +
        (col like 'term2') +
         . . .
        (col like 'termN')
       ) as NumMatches
from t
having NumMatches > 0
order by NumMatches desc;

MySQL 将布尔值视为 0(假)和 1(真)。您可以将它们加在一起以获得匹配的总数。

【讨论】:

  • 好吧,这很好用,但我还有一个问题:如何让它只选择匹配的行?现在它给了我所有的行,尽管按相关性正确排序! :)
  • 您可以在from t之后添加having NumMatches > 0
  • 这就像一个魅力。我会将having NumMatches > 0 添加到您的原始答案中。谢谢!
猜你喜欢
  • 2012-11-09
  • 2011-11-05
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多