根据字段的组合权重排序结果

时间:2011-08-08 03:54:50

标签: mysql sql full-text-search

对于所有SQL主人,我都有一个非常有趣的问题。

众所周知,任何基于电子商务的购物车的主要要求之一都是很好的搜索。

几天前,我开始了解MySQL全文搜索,我必须说它很安静。

我想在搜索查询中领先一步,并且需要为字段提供权重。这些权重将允许对搜索结果进行排序。

例如:我在产品表中有以下字段

productid
name
description
price

'name'和'description'字段是全文索引的。

对于任何搜索关键字,查询应查看两个字段:名称,描述。但是,与描述字段相比,名称字段应具有更多权重。

如果你对我的问题不太了解,那么下面的例子应该有所帮助。

 productid             name                   description                price
 1                  nice keyboard      this is a nice nice keyboard     10                
 2                  nice nice keyboard this is a nice nice keyboard     10                
 3                  keyboard           this is a nice keyboard     10                

当搜索关键字为'nice'时,'name'字段的权重为10,而'description'字段的权重为:1

for productid:1,nice在名称中找到1(一次),在描述中找到2(两次)。因此组合权重为(1 * 10 + 2 * 1 = 10 + 2 = 12)

对于productid:2,在名称中找到2(两次),在描述中找到2(两次)。因此组合权重为(2 * 10 + 2 * 1 = 20 + 2 = 22)

for productid:3,nice在名称中找到0(无),在描述中找到1(一次)。因此组合权重为(0 * 10 + 1 * 1 = 0 + 1 = 1)

2个问题

(1)如何为特定领域提供重量?我是否需要再次创建全文索引以提供权重?

(2)我需要查询,它可以在desc中输出结果。组合重量的顺序。

1 个答案:

答案 0 :(得分:1)

全文搜索可以为您提供搜索的相对相关性:

SELECT * FROM
(
    SELECT id,
    (MATCH(name) AGAINST ('nice')*10 ) + MATCH(description) AGAINST('nice') AS relevance
    FROM products
    WHERE MATCH(name) AGAINST ('nice') OR
    MATCH(description) AGAINST ('nice')
) ORDER BY revelence DESC

通过将名称相关性乘以10,我将相关性得分偏向了名称