所以我一直在阅读以下内容:
How can I manipulate MySQL fulltext search relevance to make one field more 'valuable' than another?
我对以下回复感兴趣,并试图成功实现这一点。
SELECT url, keywords, title,
MATCH (keywords) AGAINST ('green watermelon') AS rel1,
MATCH (title) AGAINST ('green watermelon') AS rel2
FROM straight
WHERE MATCH (keywords,title) AGAINST ('green watermelon')
ORDER BY (rel1)+(rel2*1.5)
我唯一的问题如下。
如果用户要搜索说"绿色西瓜"它匹配一个表中有3行的行,如下所示:
+------------+------------+ | Keyword | Title | +------------+------------+ | Green | Green | | Green | Watermelon | | Watermelon | Watermelon | +------------+------------+
我希望第二张唱片成为"排名"首先,因为它是最相关的,但它们都具有与搜索词相同的相关性"绿色西瓜"由于" Green"在关键字和标题中使用两次。
我认为可以解决这个问题的最佳方法是,如果它将相关性增加到1,那么它会找到绿色这个词,而任何其他时候它会看到绿色这个词会增加0,那么如果它看到西瓜则会相同。这将使第二个结果的相关性得分为2,其他2个行的相关性为1.因此,使其更具相关性。在更大的数据库中搜索时,这将适用于更长的搜索字词。
编辑:
如果可能的话,我可以创建另一个既包含标题又包含关键字的列,所以说该列名为" mashup"该表现在看起来更像:
+------------+------------+-----------------------+ | Keyword | Title | Mashup | +------------+------------+-----------------------+ | Green | Green | Green Green | | Green | Watermelon | Green Watermelon | | Watermelon | Watermelon | Watermelon Watermelon | +------------+------------+-----------------------+
然后"如果可能"我们需要对这些字段进行欺骗,以便它们最终成为:
+------------+------------+-----------------------+ | Keyword | Title | Mashup | +------------+------------+-----------------------+ | Green | Green | Green | | Green | Watermelon | Green Watermelon | | Watermelon | Watermelon | Watermelon | +------------+------------+-----------------------+
然后搜索将按预期工作,并具有完美的相关性分数。
提前致谢
答案 0 :(得分:0)
您只需要在MATCH()
的第一个位置指定更重要的列 SELECT url, keywords, title
FROM straight
WHERE MATCH(title, keywords) AGAINST('green watermelon')
ORDER BY MATCH(title, keywords) AGAINST('green watermelon') DESC;
+------+------------+------------+
| id | keywords | title |
+------+------------+------------+
| 2 | Green | Watermelon |
| 3 | Watermelon | Green |
| 1 | Green | Green |
+------+------------+------------+