我在過去曾經使用過Sql Server,並且使用了它非常好的功能,叫做Sql全文搜索。現在我必須使用MySql。任何人都可以告訴我什麼是相當於全文搜索MySql?我正在使用MySql的免費版本,而不是商業版本。如果沒有,那我們還能做些什麼來模仿全文搜索並克服LIKE運算符的侷限性?什麼是MySql相當於Sql Server全文搜索?
感謝提前:)
我在過去曾經使用過Sql Server,並且使用了它非常好的功能,叫做Sql全文搜索。現在我必須使用MySql。任何人都可以告訴我什麼是相當於全文搜索MySql?我正在使用MySql的免費版本,而不是商業版本。如果沒有,那我們還能做些什麼來模仿全文搜索並克服LIKE運算符的侷限性?什麼是MySql相當於Sql Server全文搜索?
感謝提前:)
見在MySQL的全文搜索支持的文檔:
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
您將要全文索引適用於列以支持全在這些列上進行文本搜索。請注意,mysql僅支持MyISAM表上的全文索引。
舉個例子,以防萬一上面的鏈接進入死在某個時候,看到一個完整的例子,從文檔:
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO articles (title,body) VALUES
-> ('MySQL Tutorial','DBMS stands for DataBase ...'),
-> ('How To Use MySQL Well','After you went through a ...'),
-> ('Optimizing MySQL','In this tutorial we will show ...'),
-> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-> ('MySQL vs. YourSQL','In the following database comparison ...'),
-> ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body)
-> AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
參考http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html
在MyISAM
表,MySQL
支持FULLTEXT
索引:
CREATE TABLE mytable (id INT, caption TEXT, content TEXT, FULLTEXT KEY fx_mytable_caption_content (caption, content)) ENGINE=MyISAM;
SELECT *
FROM mytable
WHERE MATCH(caption, content) AGAINST ('my search query')
您可以在一列或多列上創建全文索引。然後,您可以使用全文搜索查詢來查詢表格。見MySQL Full-Text index和MySQL Full-text Search functions。
一個典型的查詢是這樣的:
SELECT * FROM books
WHERE MATCH (title, summary) AGAINST ('harry potter')
ORDER BY MATCH (title, summary) AGAINST ('harry potter')
LIMIT 0, 10
也許最好將匹配結果分配給一個名稱,然後按該名稱排序?例如。 WHERE MATCH(標題,摘要)AGAINST('哈利波特')AS相關性ORDER BY相關性? MySql可能會優化它,但仍然... – Kazar 2010-05-18 09:55:27
Kazar嗨,你的答案是版本信息。 但我所有的表都是InnoDB,因爲我使用了引用完整性約束。保持MyISAM引擎的功能是什麼?大多數現實世界的應用程序數據庫是否都具有InnoDB引擎?爲什麼會有這種限制?現在我應該刪除所有表中的所有引用完整性常量,以使其能夠使用全文搜索? – TCM 2010-05-18 12:39:50
@Nitesh:'InnoDB'是一個基於鎖的併發的事務引擎。對這種引擎的索引支持將是一件相當艱鉅的任務,因爲它需要集成到事務管理中,並且'InnoDB'沒有內部支持非btree索引。 – Quassnoi 2010-05-18 12:46:36
好吧,我看到了一個在stackoverflow本身的鏈接:-http://stackoverflow.com/questions/2638698/mysql-full-text-search-workaround-for-innodb-tables 它要求創建一個臨時表並刪除它們這對於在每個搜索操作中創建和刪除將是非常昂貴的。相反,我會複製我想要完成全文搜索的幾張表格。順便說一下,我從來沒有在Sql Server 2005中選擇任何引擎類型,它仍然支持引用完整性和Sql全文搜索。事實上,從sql server 2000開始支持全文搜索,2005年它變得更好了 – TCM 2010-05-18 12:54:22