程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql 隱約搜刮的辦法引見

mysql 隱約搜刮的辦法引見

編輯:MySQL綜合教程

mysql 隱約搜刮的辦法引見。本站提示廣大學習愛好者:(mysql 隱約搜刮的辦法引見)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql 隱約搜刮的辦法引見正文


網上查了一下,有兩種辦法,第一種最土的辦法:應用like語句第二種聽濤哥說用全文索引,就在網上搜一下: 若何在MySQL中取得更好的全文搜刮成果

許多互聯網運用法式都供給了全文搜刮功效,用戶可使用一個詞或許詞語片段作為查詢項目來定位婚配的記載。在後台,這些法式應用在一個SELECT 查詢中的LIKE語句來履行這類查詢,雖然這類辦法可行,但關於全文查找而言,這是一種效力極端低下的辦法,特別在處置年夜量數據的時刻。

mysql針對這一成績供給了一種基於內建的全文查找方法的處理計劃。在此,開辟者只須要簡略地標志出須要全文查找的字段,然後應用特別的MySQL辦法在那些字段運轉搜刮,這不只僅進步了機能和效力(由於MySQL對這些字段做了索引來優化搜刮),並且完成了更高質量的搜刮,由於MySQL應用天然  說話來智能地對成果評級,以去失落不相干的項目。
這篇文章將向您講述在MySQL中若何停止全文搜刮。

在停止數據庫查詢時,有完全查詢和隱約查詢之分。
SELECT 字段 FROM 表 WHERE 某字段 Like 前提
個中關於前提,SQL供給了四種婚配形式:
1,%:表現隨意率性0個或多個字符。可婚配隨意率性類型和長度的字符,有些情形下若是中文,請應用兩個百分號(%%)表現。
好比 SELECT * FROM [user] WHERE u_name LIKE '%三%'
將會把u_name為“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記載全找出來。
別的,假如須要找出u_name中既有“三”又有“貓”的記載,請應用and前提
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'
若應用 SELECT * FROM [user] WHERE u_name LIKE '%三%貓%'
固然能搜刮出“三腳貓”,但不克不及搜刮出相符前提的“張貓三”。
2,_: 表現隨意率性單個字符。婚配單個隨意率性字符,它經常使用來限制表達式的字符長度語句:
好比 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”如許u_name為三個字且中央一個字是“三”的;
再好比 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三腳貓”如許name為三個字且第一個字是“三”的;
3,[ ]:表現括號內所列字符中的一個(相似正則表達式)。指定一個字符、字符串或規模,請求所婚配對象為它們中的任一個。
好比 SELECT * FROM [user] WHERE u_name LIKE '[張李王]三'
將找出“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ] 內有一系列字符(01234、abcde之類的)則可略寫為“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
將找出“老1”、“老2”、……、“老9”;
4,[^ ] :表現不在括號所列以內的單個字符。其取值和 [] 雷同,但它請求所婚配對象為指定字符之外的任一個字符。
好比 SELECT * FROM [user] WHERE u_name LIKE '[^張李王]三'
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
將消除“老1”到“老4”,尋覓“老5”、“老6”、……
5,查詢內容包括通配符時
因為通配符的原因,招致我們查詢特別字符“%”、“_”、“[”的語句沒法正常完成,而把特別字符用“[ ]”括起即可正常查詢。據此我們寫出以下函數:
function sqlencode(str)
str=replace(str,"[","[[]") '此句必定要在最前
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
在查詢前將待查字符串先經該函數處置便可。

1、設置根本表格
從創立例子表格開端,應用以下的SQL敕令:
mysql> CREATE TABLE reviews (id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT, data TEXT);
以上敕令創立了一個簡略的音樂專集材料庫(重要是整段的文字),然後向這個表格中添加一些記載:
mysql> INSERT INTO `reviews` (`id`, `data`) VALUES
(1, 'Gingerboy has a new single out called Throwing Rocks. It\'s great!');
mysql> INSERT INTO `reviews` (`id`, `data`) VALUES
(2, 'Hello all, I really like the new Madonna single.
One of the hottest tracks currently playing...I\'ve been listening to it all day');
mysql> INSERT INTO `reviews` (`id`, `data`)
VALUES (3, 'Have you heard the new band Hotter Than Hell?
They have five members and they burn their instruments when they play in concerts.
These guys totally rock! Like, awesome, dude!');
驗證數據的准確錄入:
mysql> SELECT * FROM reviews;
+----+--------------------------------------------+
id data
+----+--------------------------------------------+
1 Gingerboy has a new single out called ...

2 Hello all, I really like the new Madon ...
3 Have you heard the new band Hotter Than...
+----+--------------------------------------------+
3 rows in set (0.00 sec)
2、界說全文搜刮字段
接上去,界說您要作為全文搜刮索引的字段
mysql> ALTER TABLE reviews ADD FULLTEXT INDEX (data);
Query OK, 3 rows affected (0.21 sec)
Records: 3 Duplicates: 0 Warnings: 0
應用SHOW INDEXES敕令來檢討索引曾經被添加了:
mysql> SHOW INDEXES FROM reviews;
+---------+---------------+--------+------+------------+---------+
Table Column_name Packed Null Index_type Comment
----------+---------------+--------+------+------------+---------+
reviews id NULL BTREE
reviews data NULL YES FULLTEXT
+---------+---------------+--------+------+------------+---------+
3、運轉全文搜刮
當您具有了數據和索引,便可以應用MySQL的全文搜刮了,最簡略的全文搜刮方法是帶有MATCH...AGAINST語句的SELECT查詢,以下是一個簡略的例子,可以來查找含有單詞“single”的記載:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('single');+----+
id
+----+
1
2
+----+
2 rows in set (0.00 sec)
在此,MATCH()將作為參數傳遞給它的字段中的文字與傳遞給AGAINST()的參數停止比擬,假如有婚配的,那就依照正常的方法前往。留意您可以傳遞不止一個字段用MATCH()來檢查­-只需用逗號來朋分字段列表。
當MySQL收到了一個全文搜刮的要求,它就在外部對每一個記載停止評分,不婚配的記載得分為零,而“更相干”的記載會獲得比“不太相干”的記載絕對更高的分數。相干性是由MySQL的一系列辨別尺度來決議的,檢查MySQL的用戶手冊可以獲得更多的信息。
想看到每一個記載的評分若何,只須要前往MATCH()辦法作為成果集的一部門,以下所示:
mysql> SELECT id, MATCH (data) AGAINST ('rock') FROM reviews;

+----+-------------------------------+
id MATCH (data) AGAINST ('rock')
+----+-------------------------------+
1 0
2 0
3 1.3862514533815
+----+-------------------------------+
3 rows in set (0.00 sec)
4、應用邏輯搜刮潤飾符(Boolean search modifiers)
您還可使用邏輯搜刮潤飾符來停止更准確的搜刮,這經由過程在AGAINST語句中添加特別的IN BOOLEAN MODE潤飾符來完成,在以下的例子中,將查找含有單詞“single”然則沒有“Madonna”的記載:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('+single -madonna' IN BOOLEAN MODE);
+----+
id
+----+
1
+----+
1 row in set (0.00 sec)
這一搜刮特征平日用於搜刮單詞片段(而不是完全的詞語),這可以經由過程在IN BOOLEAN MODE語句中的*(星號)操作符來完成,以下的例子展現了若何查找單詞中含有“hot”的記載:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('hot*' IN BOOLEAN MODE);+----+
id
+----+
3
2
+----+
2 rows in set (0.00 sec)
您還可使用這類辦法來查找至多一個傳遞到AGAINST的參數中,以下的例子查找了至多包括單詞“hell”和“rocks”中的一個的記載:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('hell rocks' IN BOOLEAN MODE);
+----+
id
+----+
1
3
+----+
3 rows in set (0.00 sec)
以上的這些例子演示了絕對於傳統的SELECT...LIKE語句,停止全文搜刮的更有用的辦法,當您下一次須要編寫MySQL數據庫搜刮界面的時刻,您可以測驗考試這一辦法。 終究發明應用不了,緣由是只要MyISAM引擎才支撐全文索引,暈。好吧,照樣用like停止搜刮。。。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved