我搜索了一個搜索引擎,但是價格昂貴或者構建起來似乎需要很多時間,所以我想通過'歌手名稱音樂名稱'將其保存并用作fullText-index。
然而,即使我不停地尋找,它也不斷地與like進行比較,介紹的也只是功能的優點,缺點即使再找也很難看出。
目前除了創建30000左右資料時索引增長外沒有什么大問題,所以我打算用它,但我想知道fulltext-index的缺點是什么!
如果你另外搜索,他們說最好安裝一個詞素分析器,但我打算使用 ngram=1 的 ngram 分析器。
另外)如果索引太大可能是個問題,我想知道如何增加 ngram 大小并搜索 2 個或更少的字母。
uj5u.com熱心網友回復:
的缺點FULLTEXT。請注意,許多問題都可以解決,但需要額外的代碼。
- “字母”的定義。也就是說,某些標點符號被視為分詞。您可能能夠忍受它,或者您可以清理輸入(見下文)。
- 最小字長——默認為 3。您可以將其降低到 2 甚至 1,但這是要付出代價的。避免在“消毒”中使用短詞是一種解決方案。
- 不能強制出現短詞和停用詞。(我認為這是一個錯誤。)
AGAINST (" john q smith" IN BOOLEAN MODE)總是會失敗。另一方面,這會成功,盡管它可能會提供太多行:AGAINST (" john q smith" IN BOOLEAN MODE)。也就是說,“John W Smith”將會成功。參見下面的“微調”。 - 當單詞的順序很重要時(你想要“foo bar”,而不是“bar foo”或“foo blah blah bar”),你可以在 FT 中使用一些引號來強制這樣做。(注意短詞。)
- “停用詞”——有一個不索引的詞串列(例如,“the”)。您可以指向不同的串列。(我沒有想到細節。)
- 全有或全無——我在這里提到的許多可調項適用于系統中的所有FT 索引。您可能需要找到一種解決方法來獲得不同表中不同設定的效果。
消毒輸入。由于制造商的自由,零件號和型號是一件令人討厭的事情。示例:“模型 3”——“模型”是一個很好的全文“詞”,但“3”不是。您可以 [也許] 調整輸入(當 INSERTing 時)說“Model3”。另一個例子“xyz-123”。另一個:“約翰·Q·史密斯”
合并列。將可能的 FT 字串(來自許多列)放在一起并將它們放入一個純粹用于搜索的列中可能是有益的。在插入資料時進行清理。
微調。這是解決一些問題的一種方法:
WHERE MATCH(texts) AGAINST (" john q smith" IN BOOLEAN MODE)
AND texts LIKE "%John Q. Smith%"
說明... FT 測驗將首先進行并且速度很快。然后是LIKE(or REGEXP),它慢得多,但不是問題,因為它僅應用于通過 FT 測驗的那些行。示例:“John Jones and Phil Smith”將通過MATCH,但隨后被 過濾掉LIKE。
更多注意事項:http: //mysql.rjweb.org/doc.php/myisam2innodb#fulltext
您的問題開始暗示“單詞”,然后偏離到“ngram”可能更好的情況。如果是“名字”(歌手、音樂標題等),那么 ngram 可能不值得考慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535373.html
標籤:数据库全文搜索
