我正在尝试在MySQL数据库上创建(某种)全文搜索:我想在2个字段TITLE
和DESCRIPTION
中找到字符串'abc'的出现位置按出现次数(每行)对结果进行排序,最好是加权,即TITLE
中找到的每个'abc'计算DESCRIPTION
中匹配值的2倍。
这在一个(可能是长而丑)的查询中是否可行?或者我是否必须创建一些单词索引表?
到目前为止,我的方法发现了事件,但没有排序,而是单独的重量。 (我在PHP中使用后者,但这开始变得非常昂贵):
SELECT * FROM CONTENT WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')
答案 0 :(得分: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
答案 1 :(得分: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