【问题标题】:ordering results based on combine weightage of fields基于字段组合权重的排序结果
【发布时间】:2011-08-08 03:54:50
【问题描述】:

我有一个非常有趣的问题要问所有 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

对于 productid: 1,nice 在名称中找到 1(一次),在描述中找到 2(两次)。所以组合权重是 (1*10 + 2*1 = 10 + 2 = 12)

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

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

2 个问题

(1) 如何为特定字段提供权重?是否需要重新创建全文索引才能提供权重?

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

【问题讨论】:

    标签: mysql sql full-text-search


    【解决方案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,我使相关性得分偏向于名称的得分

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 2022-12-31
      • 2012-11-03
      • 2023-01-27
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多