2012-12-15 32 views
3

我有一個MyISAM表包含超過200萬條記錄,其上有多個列的FULLTEXT索引。如何使用mysql全文獲取連續詞的頻率

給定一個搜索項,我想知道它在每個記錄的索引字段中出現多少次

例如,下面的表中搜索'test'時(在其中有一個FULLTEXT指數超過兩個FREETEXTThird_Col列):

 
+----+--------------------------------------------+---------------------------+ 
| ID | FREETEXT         | Third_Col     | 
+----+--------------------------------------------+---------------------------+ 
| 1 | This is first test string in test example. | This is first test Values | 
| 2 | This is second test.      | This is sec col   | 
+----+--------------------------------------------+---------------------------+ 

我期望類似的結果:

 
+----+-------+ 
| ID | count | 
+----+-------+ 
| 1 |  3 | 
| 2 |  1 | 
+----+-------+ 

我知道在FULLTEXT索引中,MySQL使用dtf(術語出現在文檔中的次數);怎麼能得到這個?

+0

的DTF不在全文索引,請使用此本身,因爲它已經[與其他因素結合](http://dev.mysql.com/doc/internals/en/full-text-search.html)來創建一個詞彙權重。您可能會發現從相關性分數和每個文檔的已知術語權重中獲得qf更容易,但即使這樣做也會遇到問題。也許你可以在你想要完成的東西背後提供更多的背景知識?這聽起來像是[XY問題]的發生率(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – eggyal

+0

特別是,數據(甚至是搜索項)的靜態是如何的?您預期的200萬條記錄中有多少比例可能與搜索字詞匹配?你將如何處理所有結果?您是在尋找純粹的SQL解決方案,還是可以使用其他工具? – eggyal

+0

我有一個重要條款清單(超過10,000與同義詞,例如:測試,測試;;不使用證詞),我想找到那裏頻率在一個數據庫有超過2百萬條記錄。這些條款可以匹配任意數量的記錄。搜索項和數據庫是靜態的(不會更改)。我正在尋找快速解決方案(我已經用多個FULLTEXT索引構建了我的數據庫)。因爲我可以使用FULLTEXT索引在每個術語的1分鐘內獲得我的術語出現在完整數據庫中的ID(記錄標識符)。但我想要的頻率以及我將在後面的部分中使用。 – Sapan

回答

2

像這樣創建

DELIMITER $$ 

CREATE FUNCTION `getCount`(myStr VARCHAR(1000), myword VARCHAR(100)) 
    RETURNS INT 
    BEGIN 
    DECLARE cnt INT DEFAULT 0; 
    DECLARE result INT DEFAULT 1; 

    WHILE (result > 0) DO 
    SET result = INSTR(myStr, myword); 
    IF(result > 0) THEN 
     SET cnt = cnt + 1; 
     SET myStr = SUBSTRING(myStr, result + LENGTH(myword)); 
    END IF; 
    END WHILE; 
    RETURN cnt;  

    END$$ 

DELIMITER ; 

用戶定義的函數,那麼你可以在你的查詢如下

select id, getCount(concat(FREETEXT, Third_col), 'test') from yourtable 

希望它可以幫助