2013-02-17 34 views
2

我試圖在MySQL數據庫上創建(某種)全文搜索:我想在2個字段中查找出現字符串'abc' TITLEDESCRIPTION,並根據出現次數(每行)對結果進行排序,最好是加權的,即在TITLE中找到的每個「abc」都是在DESCRIPTION中匹配的2倍。按每行多個字段中的字符串發生次數排序結果

這可能在一個(可能長和醜)的查詢或我將不得不創建一些字索引表嗎?

我的方法到目前爲止發現的事件,但沒有排序,但單獨的重量。 (我在PHP後者但這開始變得非常昂貴):

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

回答

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 

Live example at SQL Fiddle.

+0

+1爲小提琴和解釋 – 2013-02-17 13:50:20

+0

如果它包含Abc .. ???如果它的情況是上限或下限,如何處理......? – 2013-04-11 11:40:53

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 
+0

+1第一正確的答案。如果只是爲了排序,您可以按搜索字符串的長度省略除法。 – Andomar 2013-02-17 13:31:29

+0

非常感謝。我不會在10年內做到這一點!作品總治療:) – 2013-02-17 13:49:49

相關問題