我打算創建一個包含數百萬行的表,按以下方式組織:
file,word,occurrences
file23,apples,343<br>
file17,apples,3<br>
file10341,apples,0<br>
...<br>
file16000,apples,0
該表將有 16,000 個獨特的詞,它們出現在 16,000 個獨特的檔案中。
我想找到一種通過定位特定單詞來查詢表格的方法,然后只找到最相關的結果 - 所以出現次數最多的前 10 個檔案。
我嘗試了以下代碼及其變體,但沒有奏效:
WHERE/HAVING `word`=('apples', 'oranges', 'prunes') ORDER BY `occurrences` DESC
話雖如此,我如何執行此查詢,即專門關注相關單詞,按出現次數列出它們,并獲取前 10-15 個最相關的檔案?
uj5u.com熱心網友回復:
這就是FULLTEXT索引的用途。該表每個檔案只有一行,所以只有 16K 行。該檔案中將有一TEXT列包含單詞。然后MATCH(col) AGAINST(" apples oranges" IN BOOLEAN MODE)將提供包含所有這些詞的行,以及相關性。(“相關性”不完全是“發生”。)
如果您選擇堅持當前的結構,則“出現次數”沒有明確指定。如果一個檔案中有 100 個蘋果和 20 個橙子怎么辦?這與每個出現 60 次的檔案完全一樣“相關”嗎?是否應該考慮帶有“蘋果”但沒有“橙子”的檔案?還是所有給定的單詞都需要出現?
順便說一句,這是您正在尋找的語法:
`word` IN ('apples', 'oranges', 'prunes')
關于您的資料的問題。(這可能會影響性能。)有多少“檔案”有一個典型的詞?通常,有多少檔案包含所有請求的單詞?
CREATE TABLE t (
`file` VARCHAR(...) NOT NULL,
`word` VARCHAR(...) NOT NULL,
occurrences INT NOT NULL,
PRIMARY KEY(`word`, `file`),
INDEX(`file`)
) ENGINE=InnoDB;
SELECT `file`, SUM(occurrences) as tot_occ
FROM t
WHERE `word` IN ('apples', 'oranges', 'prunes')
GROUP BY `file`
ORDER BY tot_occ DESC
LIMIT 10;
uj5u.com熱心網友回復:
帶限制的簡單 order by 應該可以作業。
select file, word, occurrences from yourtable where word in ('apples', 'oranges', 'prunes') ORDER BY occurrences DESC
Limit 10
** 而不是 word=('apples', 'oranges', 'prunes') 你需要使用 word in ('apples', 'oranges', 'prunes')
** Have 不是必需的,因為沒有 group by 子句
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/343762.html
