MySQL InnoDB搜尋索引的Stopwords

eric0435發表於2021-01-15

InnoDB搜尋索引的Stopwords
InnoDB的預設禁止詞列表相對較短,因為來自技術、文學和其他來源的文件經常使用短詞作為關鍵字或重要短語。例如,你可能搜尋“是”或“不是”,並期望得到一個合理的結果,而不是讓所有這些詞都被忽略
InnoDB預設的stopword列表可以透過查詢INFORMATION_SCHEMA檢視。INNODB_FT_DEFAULT_STOPWORD表。

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+-------+
| value |
+-------+
| a     |
| about |
| an    |
| are   |
| as    |
| at    |
| be    |
| by    |
| com   |
| de    |
| en    |
| for   |
| from  |
| how   |
| i     |
| in    |
| is    |
| it    |
| la    |
| of    |
| on    |
| or    |
| that  |
| the   |
| this  |
| to    |
| was   |
| what  |
| when  |
| where |
| who   |
| will  |
| with  |
| und   |
| the   |
| www   |
+-------+
36 rows in set (0.01 sec)

為了對所有InnoDB表定義了一個自定義的stopword列表,那麼使用與innodb_ft_default_stopword表相同的結構來定義你自定義的stopword表,然後向表中插入stopwords,並且在建立全文索引之前以db_name/table_name的形式設定innodb_ft_server_stopword_table選項的值。自定義的stopword表必須有一個varchar型別的value列。下面的例子演示瞭如何為innodb建立一個新的全域性stopword表。

mysql> CREATE TABLE my_stopwords(value VARCHAR(30)) ENGINE = INNODB;
Query OK, 0 rows affected (0.21 sec)
mysql> INSERT INTO my_stopwords(value) VALUES ('Ishmael');
Query OK, 1 row affected (0.12 sec)
mysql> CREATE TABLE opening_lines (
    -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> opening_line TEXT(500),
    -> author VARCHAR(200),
    -> title VARCHAR(200)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.14 sec)
mysql> INSERT INTO opening_lines(opening_line,author,title) VALUES
    -> ('Call me Ishmael.','Herman Melville','Moby-Dick'),
    -> ('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'),
    -> ('I am an invisible man.','Ralph Ellison','Invisible Man'),
    -> ('Where now? Who now? When now?','Samuel Beckett','The Unnamable'),
    -> ('It was love at first sight.','Joseph Heller','Catch-22'),
    -> ('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'),
    -> ('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'),
    -> ('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451');
Query OK, 8 rows affected (0.04 sec)
Records: 8  Duplicates: 0  Warnings: 0
mysql> SET GLOBAL innodb_ft_server_stopword_table = 'mysql/my_stopwords';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);
Query OK, 0 rows affected, 1 warning (0.91 sec)
Records: 0  Duplicates: 0  Warnings: 1

預設情況下,長度小於3個字元或大於84個字元的單詞不會出現在InnoDB全文搜尋索引中。最大和最小字長值可以透過innodb_ft_max_token_size和innodb_ft_min_token_size變數進行配置。這種預設行為不適用於ngram解析器外掛。ngram令牌大小由
ngram_token_size選項定義。

透過查詢INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE中的單詞,驗證指定的stopword ('Ishmael')沒有出現。

mysql> SET GLOBAL innodb_ft_aux_table='mysql/opening_lines';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT word FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
+-----------+
| word      |
+-----------+
| across    |
| all       |
| burn      |
| buy       |
| call      |
| comes     |
| dalloway  |
| first     |
| flowers   |
| happened  |
| herself   |
| invisible |
| less      |
| love      |
| man       |
| more      |
| mrs       |
| now       |
| now       |
| now       |
| pleasure  |
| said      |
| screaming |
| she       |
| sight     |
| sky       |
| the       |
| the       |
| this      |
| was       |
| was       |
| when      |
| where     |
| who       |
| would     |
+-----------+
35 rows in set (0.00 sec)

要在一個表一個表的基礎上建立stopword列表,需要建立其他stopword表,並在建立全文索引之前使用innodb_ft_user_stopword_table選項指定想要使用的stopword表。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2750306/,如需轉載,請註明出處,否則將追究法律責任。

相關文章