簡體   English   中英

計算MySQL中一行中單詞的出現次數

[英]Count occurrences of a word in a row in MySQL

我正在為我的網站創建一個搜索功能,它可以從數據庫中找到相關結果。 我正在尋找一種計算單詞出現次數的方法,但我需要確保單詞的兩邊都有單詞邊界(所以當我想要“rip”時,我不會以“三重”結束)。

有沒有人有任何想法?


人們誤解了我的問題:

如何計算單行內出現的次數

這不是關系數據庫非常擅長的東西,除非你可以使用全文索引,並且你已經說過你不能,因為你正在使用InnoDB。 我建議您選擇相關的行並在應用程序代碼中執行單詞計數。

創建這樣的用戶定義函數並在查詢中使用它

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 
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC
  • 此查詢可能非常慢
  • 它看起來很丑陋
  • REPLACE()區分大小寫

您可以通過使用LOWER()來克服mysql區分大小寫的REPLACE()函數的問題。

它草率,但在我看來這個查詢運行得非常快。

為了加快速度,我在一個select中檢索結果集,該select在我的'outer'查詢中聲明為派生表。 由於mysql此時已經有了結果,所以replace方法非常快。

我創建了一個類似於下面的查詢,以在多個表和多列中搜索多個術語。 我獲得了一個“相關性”數字,相當於搜索到的所有列中所有找到的搜索項的所有出現次數的總和

SELECT DISTINCT ( 
((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('there'),''))) / length('there')) 
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('there'),''))) / length('there'))
 + ((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('another'),''))) / length('another')) 
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('another'),''))) / length('another')) 
) as relevance, 
x.ent_type, 
x.ent_id, 
x.this_id as anchor,
page.page_name
FROM ( 
(SELECT 
'Foo' as ent_type, 
sp.sp_id as ent_id, 
sp.page_id as this_id, 
sp.title as ent_title, 
sp.content as ent_content,
sp.page_id as page_id
FROM sp
WHERE (sp.title LIKE '%there%' OR sp.content LIKE '%there%' OR sp.title LIKE '%another%' OR sp.content LIKE '%another%' ) AND (sp_content.title NOT LIKE '%goes%' AND sp_content.content NOT LIKE '%goes%')
) UNION (
  [search a different table here.....]
)
) as x
JOIN page ON page.page_id = x.page_id 
WHERE page.rstatus = 'ACTIVE'
ORDER BY relevance DESC, ent_title;

希望這有助於某人

- Seacrest out

這樣的事情應該有效:

從表中選擇count(*),其中fieldname REGEXP'[[:<:]] word [[:>:]]';

詳細信息請參見MySQL手冊的第11.4.2節。

LIKE或REGEXP之類的東西不會縮放(除非它是最左邊的前綴匹配)。

請考慮使用全文索引來完成您想要做的事情。

select count(*) from yourtable where match(title, body) against ('some_word');

我使用了下面鏈接中描述的技術。 該方法使用MySQL的lengthreplace功能。

關鍵字相關性

如果你想要搜索我會建議像Sphinx或Lucene這樣的東西,我發現Sphinx(作為一個獨立的全文索引器)更容易設置和運行。 它運行速度很快,並且可以非常快速地生成索引。 即使您使用MyISAM我建議使用它,它比MyISAM的全文索引功能強大得多。

它也可以(有點)與MySQL集成。

這取決於您使用的DBMS,有些允許編寫可以執行此操作的UDF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM