2

我正在尝试在 MySQL DB 上创建(某种)全文搜索:我想在 2 个字段中查找字符串“abc”的出现,TITLE并按DESCRIPTION出现次数(每行)对结果进行排序,最好是加权的,即在 中找到的每个“abc”的TITLE计数是DESCRIPTION.

这是否可能在一个(可能又长又丑)查询中实现,还是我必须创建一些单词索引表?

到目前为止,我的方法发现了这些事件,但没有排序,但只有权重。(我在 PHP 中做后者,但这开始变得非常昂贵):

SELECT * FROM CONTENT WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')
4

2 回答 2

2

尝试:

SELECT 2*(LENGTH(`TITLE`)-LENGTH(REPLACE(`TITLE`,'abc',''))) + 
         (LENGTH(DESCRIPTION)-LENGTH(REPLACE(DESCRIPTION,'abc',''))) sort_num,
       c.* FROM CONTENT c
WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')
ORDER BY 1 DESC
于 2013-02-17T13:20:13.790 回答
2

您可以使用replace搜索命中数来缩短字符串。这样,您可以计算列中字符串的出现次数。您可以在每个出现计数前面放置一个因素以增加其权重。此示例计算col1两次:

select  *
,       (
          2 * (char_length(col1) - char_length(replace(col1,'abc',''))) +
          (char_length(col2) - char_length(replace(col2,'abc','')))
        ) / char_length('abc') as Occurances
from    YourTable
order by
        Occurances desc

SQL Fiddle 上的实时示例。

于 2013-02-17T13:25:27.507 回答