PHP MySQL 搜索和按相关度排序

13

我知道如何做普通的PHP MySQL搜索并显示结果。然而,由于我试图实现的性质,我需要能够按相关性进行排序。让我更好地解释一下:

普通查询“apple iphone applications”将使用%apple iphone application%搜索数据库,但如果没有记录以该短语的确切顺序显示,则搜索将产生无结果。

基本上我需要做的是分别搜索“apple”,“iphone”和“applications”,然后将结果合并成一个,然后我需要根据在记录中找到单词的数量来评估相关性。例如,如果我按照想要的方式执行操作,并返回以下结果:

Iphone Applications From Apple
Apple Make The Best Apple Iphone Applications
Iphone Applications

它们的排名如下:

Apple Make The Best Apple Iphone Applications
Iphone Applications From Apple
Iphone Applications
由于搜索词的实例数量有多少,看到了高亮显示的内容。
[Apple] Make The Best [Apple] [Iphone] [Applications]
[Iphone] [Applications] From [Apple]
[Iphone] [Applications]

我希望我已经解释得足够清楚,如果有人能给我提供任何指导,我将非常感激。

5个回答

9
请查看MySQL全文搜索功能,这些功能可以自动按相关性返回结果,并且可以更好地控制搜索。
使用全文索引的唯一潜在问题是它们不支持InnoDB表。

6
我知道这已经过时了,但如果有人看到这条信息,请注意:现在InnoDB提供支持。 - Dreaded semicolon
谢谢您的评论。我和我的同事交谈过,他向我保证我不能使用FULLTEXT,但是自从我看到了您的评论... 谢谢。 - Korovjov

8
也许这可以帮助某些人(按相关性排序并保留字数):
无全文:
SELECT *, ( (value_column LIKE '%rusten%') + (value_column LIKE '%dagen%') + (value_column LIKE '%bezoek%') + (value_column LIKE '%moeten%') ) as count_words
FROM data_table
WHERE (value_column LIKE '%dagen%' OR value_column LIKE '%rusten%' OR value_column LIKE '%bezoek%' OR value_column LIKE '%moeten%')
ORDER BY count_words DESC

全文:

SELECT * FROM data_table
WHERE MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE)
ORDER BY MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) DESC;

1
这对我很有用。我想按相关性排序结果,但我也希望返回部分匹配项,而全文本不支持。 - cmann

5

快速的谷歌搜索给我找到了这个链接

示例:

select title, match (title,content) against (”internet”) as score 
from cont 
where match (title,content) against (”internet”) limit 10;

1
SELECT field2, field3, ..., MATCH(field1, field2) AGAINST ("search string") AS relevance WHERE MATCH(field1, field2) AGAINST "search string" ORDER BY relevance DESC LIMIT 0,10

在结果集中,将会有一个名为“相关性”的字段,用于对结果进行排序。

对于想要将“搜索字符串”作为两个单独的单词进行匹配(即任何一个单词都相关)并且在列上有FULLTEXT索引的人,您可能需要使用AGAINST('search string' IN BOOLEAN MODE)来确保返回的相关度分数不为0。我需要将此添加到我的查询中,因为MySQL仅在精确匹配短语时返回相关度分数,而不是仅匹配某些单词时。Murat的示例很好,因为当在WHERE子句中使用AGAINST(... IN BOOLEAN MODE)时,MySQL似乎不会按相关性排序。 - Noel Whitemore

0

我不知道你想要什么,但是以下代码肯定适用于你。

SELECT ("some text here" or `column_name`) RLIKE "Apple|Iphone|Application" AS Result ORDER BY Result DESC;

用竖线(|)分隔所有单词,但结果将是1或0表示是否找到。 如果您想获取已找到的行,请参见下文。

SELECT * FROM "table_name" WHERE `column_name` RLIKE "Apple|Iphone|Application";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接