2010-05-15 199 views
1

我在我的數據庫中有以下值。Mysql查詢問題

  1. 一直Lorem存有和不斷炒
  2. scrambledtexttextofandtooktooktypetexthastheunknownspecimenstandardsincetypesett

這裏是我的查詢:

SELECT 
    nBusinessAdID, 
    MATCH (`sHeadline`) AGAINST ("text" IN BOOLEAN MODE) AS score 
FROM wiki_businessads 
WHERE MATCH (`sHeadline`) AGAINST ("text" IN BOOLEAN MODE) 
    AND bDeleted ="0" AND nAdStatus ="1" 
ORDER BY score DESC, bPrimeListing DESC, dDateCreated DESC 

它不取第一個結果,爲什麼?它應該獲取第一個結果,因爲它包含文本字。我禁用了停用詞過濾功能。

這一個也沒有工作

SELECT 
    nBusinessAdID, 
    MATCH (`sHeadline`) AGAINST ('"text"' IN BOOLEAN MODE) AS score 
FROM wiki_businessads 
WHERE MATCH (`sHeadline`) AGAINST ('"text"' IN BOOLEAN MODE) 
    AND bDeleted ="0" AND nAdStatus ="1" 
ORDER BY score DESC, bPrimeListing DESC, dDateCreated DESC 

感謝
阿維納什

回答

1

全文搜索只匹配單詞和單詞的前綴。由於數據庫中的數據不包含單詞邊界(空格),因此這些單詞沒有編入索引,因此找不到它們。

你可以做一些可能的選擇是:

  • 修正數據,以便它包含單詞之間的空格。
  • 使用LIKE'%text%'代替全文搜索。
  • 使用外部全文搜索引擎。

我會依次展開每一個。

修復您的數據,使其包含單詞之間的空格。

您的數據似乎已被破壞。它看起來像文字或句子,但刪除了所有空格。你知道那是怎麼發生的嗎?是故意的嗎?也許系統中有其他地方存在缺陷。試着解決這個問題。找出數據來自哪裏,看看它是否可以正確重新導入。

如果原始來源不包含空格,也許您可​​以使用一些自然語言工具包來猜測空格的位置並插入它們。很可能已經存在可以做到這一點的庫,儘管我並不知道任何。谷歌搜索可能會找到一些東西。

使用LIKE'%text%'代替全文搜索。

解決方法是使用LIKE'%text%'代替,但請注意,這將會慢得多,因爲它將無法使用索引。但它會給出正確的結果。

使用外部全文搜索引擎。

你也可以看看LuceneSphinx。例如,我知道獅身人面像支持使用*text*來查找文本。下面是文檔中的一個摘錄,它解釋瞭如何啓用中綴搜索,這是您需要的。

9.2.16。 min_infix_len

索引的最小中綴前綴長度。可選,默認爲0(不要索引中綴)。 中綴索引允許通過'start *','* end'和'middle'通配符(關於通配符語法參考enable_star選項)來實現通配符搜索。當最小中綴長度設置爲正數時,除了關鍵字本身之外,索引器將索引所有可能的關鍵詞中綴(即子串)。太短的中綴(低於最小允許長度)將不會被編入索引。

例如,用min_infix_len = 2對關鍵字「測試」進行索引將導致索引「te」,「es」,「st」,「tes」,「est」中綴以及該詞本身。即使它們本身不包含「es」,針對「es」的這種索引的搜索也將匹配包含「測試」一詞的文檔。但是,索引中綴將使索引顯着增長(因爲索引關鍵字更多),並且會降低索引和搜索時間。

+0

那麼最好的辦法是什麼?請建議.... – Avinash 2010-05-15 08:29:44

+0

我編輯了我的問題,請檢查,新的查詢添加哪些也不能正常工作... – Avinash 2010-05-15 08:33:28

+0

我怎麼能存儲它的空間,請你解釋,我打開做,如果它不花更多的時間..... – Avinash 2010-05-15 08:34:38