【问题标题】:Relevancy search with PHP and Mysql使用 PHP 和 Mysql 进行相关性搜索
【发布时间】:2011-08-10 05:16:33
【问题描述】:

这样做的最佳方法是什么?

我有列:track_name、artist_name、album_name

我希望所有列都与搜索查询匹配。以及匹配时的一些灵活性。

mysql like 太严格了,即使是 %XXX%。它匹配整个字符串,而不是部分。

【问题讨论】:

  • 使用“%xxx%”最适合相关性搜索。你能举个例子说明你想要达到的目标吗?
  • LIKE '%XXX%' 将匹配一个文本:“this statement is true if I don't browse xxx movies” 你真正想要达到什么目的?
  • 假设我搜索了以下内容:“艺术家姓名 - 曲目名称”。 mysql 语句应该由艺术家的名字@artist_name 和曲目名称@track_name 触发

标签: php mysql search full-text-search sql-like


【解决方案1】:

您的 MySQL 查询可能有多个 OR 子句,搜索用户输入的每个以空格分隔的单词。例如,用户搜索“石器时代的女王”可能在 SQL 中表示为SELECT * FROM songs WHERE artist_name LIKE "%Queens%" OR artist_name LIKE "Stoneage"

但是,这可能是不可取的,因为以 % 开头的 LIKE 搜索效率低下,并且在大型数据库上可能非常慢。

虽然我无法谈论性能影响,但您应该看看natural language full-text searches。这可能是您能找到的最有效的解决方案:

SELECT * FROM songs WHERE MATCH(track_name, artist_name, album_name) AGAINST('Queens of the Stoneage' IN NATURAL LANGUAGE MODE);

确实存在一些用于确定文本字符串相似性的 PHP 函数,但将这项工作保存在数据库中可能是最有效的(并且不那么令人沮丧):

【讨论】:

    【解决方案2】:

    我认为您需要重新考虑您的申请。我从您的评论中了解到,您需要在程序中实现一些逻辑运算符,例如“and”、“or”和“not”。它不仅仅是像全文索引这样的花哨算法或像这个 mysql 匹配查询这样的最长公共子字符串。但我可能是错的。

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 2010-11-02
      • 2019-11-16
      • 1970-01-01
      • 2012-10-30
      • 2010-09-25
      • 2013-04-08
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多