2009-03-04 69 views
4

什麼是限制或陷阱或反模式或陷阱?Mysql全文索引限制?

它看起來非常有吸引力,顯然你可以創建幾乎沒有工作的搜索引擎。但它不能沒有它的問題...

你有什麼經驗?

回答

4

在我看來,最大的缺點是MySQL全文索引僅限於MyISAM表。與InnoDB表格相反,這些表格缺少很多重要的功能,例如交易。

+4

您可以通過創建一個從屬機器來解決此問題。從機上的表格類型不必與主機匹配,這意味着您的innodb主機可以擁有一個全文搜索的myisam從機。 http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-diffengines.html – txyoji 2009-09-17 23:00:28

4

對於大型表格,您需要在MySQL配置文件中增加緩衝區大小和緩存限制。

此外,您在搜索中使用的MATCH()列需要與索引中的列相同。

14

它不可能是沒有問題...

這當然不是!

任何純粹由被阻止的單詞組成的搜索詞都會默默地失敗。由於最小/最大長度限制和/或停用詞文件,可能會阻止單詞。

我發現默認的停用詞文件過於激進,它阻止了許多有效的搜索。此外,默認的最小長度爲4的遊戲經常會出現人們可能想要搜索的縮略詞。我將ft_min_word_len減少到3並完全刪除了停止列表(ft_stopword_file ='')。 Doc:http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

您也可以檢查搜索查詢以查看它是否僅包含< 4個字母的單詞,並且在這種情況下回退到LIKE搜索。沒有這樣簡單的方法來在應用程序級別避開停止列表。

'單詞字符'的選擇可能無法滿足您的需求,而且更改很棘手。例如,搜索「Terry」不符合「Terry's」。一般來說,不支持任何形式的詞幹,所以「餅乾」也不會與「餅乾」相匹配。

最後,正如cg提到的,InnoDB不支持。在這個時代,你不希望把所有的數據放在MyISAM表中。

如果您有足夠的存儲空間,您可以將主要規範版本的數據放在InnoDB表中,然後創建一個單獨的MyISAM表,其中包含純文本內容的副本,純粹用於作爲searchbait。您必須更新這兩個表上的更改,但是如果MyISAM表失去完整性,那麼至少您只能失去搜索相關行的能力,而不是暴露實際的實時數據並獲取應用程序錯誤。

然後,如果您有空閒的週期,可以在searchbait上實現自己的文本處理並查詢單詞以解決上述某些限制。例如,您可以轉義想要成爲單詞字符的字符,刪除不想成爲單詞字符的字符,並執行簡單的手動英語詞幹。