日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL中文全文检索

發(fā)布時間:2025/1/21 数据库 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL中文全文检索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概述

MySQL全文檢索是利用查詢關(guān)鍵字和查詢列內(nèi)容之間的相關(guān)度進行檢索,可以利用全文索引來提高匹配的速度。

二、語法

1 2 MATCH?(col1,col2,...)?AGAINST?(expr?[search_modifier]) search_modifier:?{?IN?BOOLEAN?MODE?|?WITH?QUERY?EXPANSION?}

例如:SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('詞1 詞2 詞3 ... 詞m');

即:MATCH 相當于要匹配的列,而 AGAINST 就是要找的內(nèi)容。??

這里的table需要是MyISAM類型的表,col1、col2 必須是char、varchar或text類型,在查詢之前需要在 col1 和 col2 上分別建立全文索引(FULLTEXT索引)。

三、檢索方式

1、自然語言檢索: IN NATURAL LANGUAGE MODE

2、布爾檢索: IN BOOLEAN MODE

剔除一半匹配行以上都有的詞,譬如說,每個行都有this這個字的話,那用this去查時,會找不到任何結(jié)果,這在記錄條數(shù)特別多時很有用,原因是數(shù)據(jù)庫認為把所有行都找出來是沒有意義的,這時,this幾乎被當作是stopword(中斷詞);但是若只有兩行記錄時,是啥鬼也查不出來的,因為每個字都出現(xiàn)50%(或以上),要避免這種狀況,請用IN BOOLEAN MODE。

IN BOOLEAN MODE的特色:

·不剔除50%以上符合的row。

·不自動以相關(guān)性反向排序。?

·可以對沒有FULLTEXT index的字段進行搜尋,但會非常慢。

·限制最長與最短的字符串。

·套用Stopwords。

搜索語法規(guī)則:

+?? 一定要有(不含有該關(guān)鍵詞的數(shù)據(jù)條均被忽略)。

-?? 不可以有(排除指定關(guān)鍵詞,含有該關(guān)鍵詞的均被忽略)。?

>?? 提高該條匹配數(shù)據(jù)的權(quán)重值。

<?? 降低該條匹配數(shù)據(jù)的權(quán)重值。

~?? 將其相關(guān)性由正轉(zhuǎn)負,表示擁有該字會降低相關(guān)性(但不像 - 將之排除),只是排在較后面權(quán)重值降低。

*?? 萬用字,不像其他語法放在前面,這個要接在字符串后面。

" " 用雙引號將一段句子包起來表示要完全相符,不可拆字。

1 2 3 4 5 6 7 8 9 10 11 12 --?+?表示AND,即必須包含。-?表示NOT,即必須不包含。即:返回記錄必需包含?apple,且不能包含?banner。 SELECT?*?FROM?articles?WHERE?MATCH?(title,content)?AGAINST?('+apple?-banana'?IN?BOOLEAN?MODE); --?apple和banana之間是空格,空格表示OR。即:返回記錄至少包含apple、banana中的一個。 SELECT?*?FROM?articles?WHERE?MATCH?(title,content)?AGAINST?('apple?banana'?IN?BOOLEAN?MODE); --?返回記錄必須包含apple,同時banana可包含也可不包含,若包含的話會獲得更高的權(quán)重。 SELECT?*?FROM?articles?WHERE?MATCH?(title,content)?AGAINST?('+apple?banana'?IN?BOOLEAN?MODE); --?~?是我們熟悉的異或運算符。返回記錄必須包含apple,若也包含了banana會降低權(quán)重。 --?但是它沒有?+apple?-banana?嚴格,因為后者如果包含banana壓根就不返回。 SELECT?*?FROM?articles?WHERE?MATCH?(title,content)?AGAINST?('+apple?~banana'?IN?BOOLEAN?MODE); --?返回必須同時包含“apple?banana”或者必須同時包含“apple?orange”的記錄。 --?若同時包含“apple?banana”和“apple?orange”的記錄,則“apple?banana”的權(quán)重高于“apple?orange”的權(quán)重。 SELECT?*?FROM?articles?WHERE?MATCH?(title,content)?AGAINST?('+apple?+(>banana?<orange)'?IN?BOOLEAN?MODE);

?3、查詢擴展檢索: WITH QUERY EXPANSION

四、MySQL全文檢索的條件限制

1、在MySQL5.6以下,只有MyISAM表支持全文檢索。在MySQL5.6以上Innodb引擎表也提供支持全文檢索。

2、相應字段建立FULLTEXT索引

五、與全文檢索相關(guān)的系統(tǒng)變量:

ft_min_word_len = 全文檢索的最小許可字符(默認4,通過 SHOW VARIABLES LIKE 'ft_min_word_len' 可查看),中文通常是兩個字就是一個詞,所以做中文的話需要修改這個值為2最好。

六、總結(jié)事項

1、預設搜尋是不分大小寫,若要分大小寫,columne 的 character set要從utf8改成utf8_bin。

2、預設 MATCH...AGAINST 是以相關(guān)性排序,由高到低。

3、MATCH(title, content)里的字段必須和FULLTEXT(title, content)里的字段一模一樣。

如果只要單查title或content一個字段,那得另外再建一個 FULLTEXT(title) 或 FULLTEXT(content),也因為如此,MATCH()的字段一定不能跨table,但是另外兩種搜尋方式好像可以。

4、MySQL不支持中文全文索引,原因很簡單:與英文不同,中文的文字是連著一起寫的,中間沒有MySQL能找到分詞的地方,截至目前MySQL5.6版本是如此,但是有變通的辦法,就是將整句的中文分詞,并按urlencode、區(qū)位碼、base64、拼音等進行編碼使之以“字母+數(shù)字”的方式存儲于數(shù)據(jù)庫中。

七、實驗部分

◆ 步驟1 配置my.ini,在my.ini末尾添加如下:

# 修改全文檢索的最小許可字符為2個字符或漢字 ft_min_word_len = 2

完成后“重啟 MySQL 服務”,并用 SHOW VARIABLES LIKE 'ft_min_word_len' 查詢下是否得到了正確的結(jié)果值為2,如下圖:

◆ 步驟2 創(chuàng)建數(shù)據(jù)庫(視情況可跳過此步)

1 CREATE?DATABASE?search?DEFAULT?CHARACTER?SET?utf8?COLLATE?utf8_general_ci;

◆ 步驟3 創(chuàng)建數(shù)據(jù)表

1 2 3 4 5 6 7 8 9 10 11 12 CREATE?TABLE?`zzx_articles`?( ????`id`?int(10)?unsigned?NOT?NULL?auto_increment,? ????`title`?char(254)?default?NULL?COMMENT?'標題', ????`content`?text?COMMENT?'內(nèi)容', ????`author`?char(60)?default?NULL?COMMENT?'作者', ????`title_fc`?char(254)?default?NULL?COMMENT?'標題的分詞', ????`content_fc`?text?COMMENT?'內(nèi)容的分詞', ????PRIMARY?KEY??(`id`), ????FULLTEXT?KEY?`zzx_title_fc`?(`title_fc`), ????FULLTEXT?KEY?`zzx_content_fc`?(`content_fc`), ????FULLTEXT?KEY?`zzx_title_con_fc`?(`title_fc`,`content_fc`) )?ENGINE=MyISAM?DEFAULT?CHARSET=utf8

# 如果后期需要添全文加索引可以用如下語句:

1 2 3 alter?table?`zzx_articles`?add?fulltext?zzx_title_fc(`title_fc`);? alter?table?`zzx_articles`?add?fulltext?zzx_con_fc(`content_fc`);? alter?table?`zzx_articles`?add?fulltext?zzx_title_con_fc(`title_fc`,`content_fc`);

◆ 步驟4 插入測試數(shù)據(jù)

1 2 3 4 5 6 7 8 9 10 11 INSERT?INTO?`zzx_articles`?(title_fc,content_fc)?VALUES ('MySQL?Tutorial?Linux?red','DBMS?stands?for?DataBase?ok'), ('How?To?Use?MySQL?Well','After?you?went?through?blue'), ('Optimizing?MySQL?ok','In?this?tutorial?we?will?optimizing'), ('MySQL?vs?this?YourSQL?blue?red','1.?Never?run?mysqld?as?root?red'), ('MySQL?Tricks?blue','In?the?following?database'), ('MySQL?Security','When?configured?properly,?MySQL'), ('中華','中華人民共和國?'), ('中華情?和諧','上海?和諧'), ('污染之都','你好?我是?北京?人'), ('北京精神','創(chuàng)新?愛國?包容?厚顏')

插入結(jié)果如下圖:

◆ 步驟5 搜索語法規(guī)則、排序 實驗

說明:匹配語句 MATCH (col1,col2,...) AGAINST (expr [search_modifier]) 匹配完成后,會返回此條數(shù)據(jù)的權(quán)重值(權(quán)重值1 ≈ 各個詞的匹配結(jié)果權(quán)重值之和),我們利用此權(quán)重值“由高到低”排序可優(yōu)化查詢結(jié)果。

------------------------------------------------------------------------------------------------------------------------------

? 實驗1:只對 title_fc 索引字段做全文檢索,并顯示每條數(shù)據(jù)的權(quán)重值

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):

1.當沒有加 + - 這樣的過濾符號時,這些關(guān)鍵詞是“或(or)”的關(guān)系,即:要么匹配optimizing,要么匹配ok,要么匹配red,要么匹配blue。

2.通過上面實驗,發(fā)現(xiàn)當某條數(shù)據(jù)有多個關(guān)鍵詞匹配時(如:red blue),此條數(shù)據(jù)的權(quán)重值會略高:此條數(shù)據(jù)權(quán)重值 ≈ optimizing權(quán)重值 + ok權(quán)重值 + red權(quán)重值 + blue權(quán)重值理論上來說,當一條數(shù)據(jù)能匹配上的關(guān)鍵詞越多,則此條數(shù)據(jù)的權(quán)重值越高,排名越靠前。

------------------------------------------------------------------------------------------------------------------------------

? 實驗2:過濾條件:必須包含"red"關(guān)鍵詞

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?+red'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):使用了過濾符號 + ,表示查詢結(jié)果中,任一條數(shù)據(jù)都必須包含"red"這個詞,不包含"red"這個詞的行均被忽略。

------------------------------------------------------------------------------------------------------------------------------

? 實驗3:過濾條件:必須包含"red"關(guān)鍵詞,如果匹配到的行中還含有"blue"關(guān)鍵詞,則會對此條數(shù)據(jù)增加權(quán)重:

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?+red?blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

?或下面寫法:

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?>blue')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?+red?>blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):與實驗2比較,當包含了red的行中,若也包含blue關(guān)鍵詞,權(quán)重確實增加了(如:id=4這條)。

------------------------------------------------------------------------------------------------------------------------------

? 實驗4:過濾條件:必須包含"red"關(guān)鍵詞,并且不能包含"blue"關(guān)鍵詞

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?+red?-blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):可見 + - 這兩個符號是表示“并且(and)”的意思,即:必須包含red關(guān)鍵詞 and 不能包含blue關(guān)鍵詞。

------------------------------------------------------------------------------------------------------------------------------

? 實驗5:過濾條件:必須包含"red"關(guān)鍵詞,如果匹配到的行中還包含"blue"關(guān)鍵詞則降低此條數(shù)據(jù)權(quán)重

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?+red?~blue')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?+red?~blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):這個實驗沒有看到明顯效果,但 ~ 過濾符確實是降低此權(quán)重符

------------------------------------------------------------------------------------------------------------------------------

? 實驗6:過濾條件:匹配包含單詞“red”和“Linux” 的行,或包含“red” 和“blue”的行(無先后順序)然而包含 “apple Linux”的行較包含“apple blue”的行有更高的權(quán)重值。

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('+red??+(>Linux?<blue)')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('+red??+(>Linux?<blue)'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

------------------------------------------------------------------------------------------------------------------------------?

? 實驗7:過濾條件:匹配關(guān)鍵詞以 re 開頭,或以 bl 開頭的數(shù)據(jù)行

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('re*?bl*')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('re*?bl*'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):注意 * 是寫在后面哦,此時相當于 like 模糊匹配,沒有權(quán)重值了

------------------------------------------------------------------------------------------------------------------------------?

? 實驗8:過濾條件:匹配查找字符串“To Use MySQL”關(guān)鍵詞

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('"To?Use?MySQL"')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('"To?Use?MySQL"'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):此時是把雙引號內(nèi)的的字符串看成一個關(guān)鍵詞,若不用雙引號則是將 To Use MySQL 三個關(guān)鍵詞去分別匹配,兩者有區(qū)別;

------------------------------------------------------------------------------------------------------------------------------

? 實驗9:在實驗1基礎上,將blue的權(quán)重值忽視不要(注意與實驗1比較)

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):在實驗1的基礎上,此時去除select字段條件里的blue關(guān)鍵詞,但在where里去仍保留blue關(guān)鍵詞。我的本意是想正常匹配“optimizing ok red blue”這幾個關(guān)鍵詞,但不想得到blue的權(quán)重值(忽視blue的權(quán)重值)。

查詢的結(jié)果是含有blue關(guān)鍵詞的數(shù)據(jù)的權(quán)重值會略降低了。

通過“降重”——忽略某些關(guān)鍵詞權(quán)重值的方式可使部分數(shù)據(jù)權(quán)重值減小,進而影響排序。

------------------------------------------------------------------------------------------------------------------------------

? 實驗10:在實驗9的基礎上,在select字段條件里增加幾個red關(guān)鍵詞,where里的關(guān)鍵詞保持不變(注意與實驗1 實驗9比較)。

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?red?red')?as?title_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC

???

總結(jié):發(fā)現(xiàn)只要含有 red 關(guān)鍵詞的數(shù)據(jù)的權(quán)重值都增加了,排序也發(fā)生了變化。說明通過“提重”——重復多次某些關(guān)鍵詞權(quán)重值的方式可使部分數(shù)據(jù)權(quán)重值增加,進而影響排序。

------------------------------------------------------------------------------------------------------------------------------

? 實驗11:同時對 title_fc 和 content_fc 兩字段做全文檢索

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score,MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?as?content_score ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc,content_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?title_score?DESC,content_score?DESC

???

總結(jié):通過實驗發(fā)現(xiàn),又成功的取到了 content_fc 字段匹配的權(quán)重值,排序方式是首要按title字段權(quán)重降序排序,次要按 content_fc 權(quán)重降序排序。另外我發(fā)現(xiàn) ok 這個關(guān)鍵詞在對“title_fc char(254)”字段匹配時得到匹配值為2.1xxxxxxx,但對“content_fc text”字段匹配時權(quán)重值去為0,這是MySQL對各英文單詞權(quán)重值的給予有自己的算法,我們無權(quán)干涉。所以當我們發(fā)現(xiàn)有些單詞的權(quán)重值為零甚至為負時,不用過于糾結(jié),因為MySQL有自己的算法。

關(guān)于排序,首要按 title_score 字段權(quán)重降序排序,次要按 content_score 權(quán)重降序排序,這樣的排序規(guī)則看起來更科學了,但我想優(yōu)秀的搜索引擎絕不至于簡單如此吧,繼續(xù)下面的實驗:

-----------------------------------------------------------------------------------------------------------------------------

? 實驗12:進一步優(yōu)化 排序規(guī)則看一個SQL語句原型,查詢“字段1,字段2”兩字段,同時將每條數(shù)據(jù)的“字段1”與“字段2”的求和作為“字段3”字段:

1 2 3 select?字段1,字段2,字段1?+?字段2?as?字段3 ???????from?表名 ???????where?.....

下面將 title_fc 和 content_fc 兩權(quán)重值求和,放入新字段 score1 中,并按 score1 首要排序,title_score 次之,content_score再次之:

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score,MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?as?content_score,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?+?MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?as?score1 ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc,content_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?score1?DESC,title_score?DESC,content_score?DESC

總結(jié):相對而言,如果 title_fc 和 content_fc 都匹配上了,應給予靠前的排名吧。所以首要按其 title_fc 和 content_fc 兩權(quán)重值之和排名,次要再考慮 title_fc、content_fc 排序。

------------------------------------------------------------------------------------------------------------------------------

? 實驗13:另一個角度看排序看一個SQL語句原型,如果性別字段值為“1”顯示“男”否則顯示“女”

1 select?*,IF(sex=1,"男","女")?as?ssva?from?表名?where?id?=?1

?我的新排序思路:如果 title_fc 和 content_fc 同時匹配上的行做首要排序,然后對只匹配上 title_fc 的做次要排序,只匹配上 content_fc 的再次要排序。 (對于實驗5的排序不科學之處在于:如果有一個對content_fc關(guān)鍵詞的匹配權(quán)重很高,導致了求和后 score1 的值也高,但對title_fc的匹配權(quán)重去為0,由于score1值高卻排到了前面這不一定科學吧?)

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score,MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?as?content_score,IF(MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?>?0?AND?MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?>?0,1,0)?as?score1 ???FROM?zzx_articles? ???WHERE?MATCH?(title_fc,content_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?score1?DESC,title_score?DESC,content_score?DESC

總結(jié):如果 title_fc 和 content_fc 都匹配上了,做為優(yōu)先排序理所當然,但也應考慮局部權(quán)重值過高的問題哦。

------------------------------------------------------------------------------------------------------------------------------

? 實驗14:優(yōu)化實驗13,可支持更復雜的條件排序看一個SQL語句原型,CASE WHEN THEN END 結(jié)構(gòu):

1 2 3 4 5 6 7 CASE?<單值表達式> ??????????????WHEN?<表達式值>?THEN?<SQL語句或者返回值> ??????????????WHEN?<表達式值>?THEN?<SQL語句或者返回值> ???????????????... ??????????????WHEN?<表達式值>?THEN?<SQL語句或者返回值> ??????????????ELSE?<SQL語句或者返回值> ??????????END

有一表查詢:大于或等于80表示顯示為“優(yōu)秀”,大于或等于60顯示為“及格”,小于60分顯示為“不及格”。

1 2 3 4 select?(CASE?WHEN?語文>=80?THEN?'優(yōu)秀'?WHEN?語文>=60?THEN?'及格'?ELSE?'不及格'?END)?as?語文, ??????????????(CASE?WHEN?數(shù)學>=80?THEN?'優(yōu)秀'?WHEN?數(shù)學>=60?THEN?'及格'?ELSE?'不及格'?END)?as?數(shù)學, ??????????????(CASE?WHEN?英語>=80?THEN?'優(yōu)秀'?WHEN?英語>=60?THEN?'及格'?ELSE?'不及格'?END)?as?英語 ???????from?table_name

# 實例測試一下

1 2 3 select?*,(CASE?WHEN?id<8?THEN?'5'?WHEN?id=8?THEN?'4'?ELSE?'0'?END)?as?newfield ???????from?zzx_articles ???????where?id>5

我的新排序思路:如果 title_fc 和 content_fc 的權(quán)重值“同時大于0且相等”為首要排序,“同時大于0且不相等”的為次要排序,“title_fc 大于0的再次要排序”,如果用 IF() 貌似不好實現(xiàn),看下面語句:

1 2 3 4 SELECT?*,MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?as?title_score,MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?as?content_score, ?????????????(CASE?WHEN?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?>?0?AND?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?=?MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?THEN?'3'?WHEN?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?>?0?AND?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?<>?MATCH?(content_fc)?AGAINST?('optimizing?ok?red?blue')?THEN?'2'?WHEN?MATCH?(title_fc)?AGAINST?('optimizing?ok?red?blue')?>?0?THEN?'1'?ELSE?'0'?END)?AS?score1 ???????FROM?zzx_articles? ???????WHERE?MATCH?(title_fc,content_fc)?AGAINST?('optimizing?ok?red?blue'?IN?BOOLEAN?MODE)?order?by?score1?DESC,title_score?DESC,content_score?DESC

總結(jié):本實驗的排序未必合乎科學,但引出一個更復雜規(guī)則的排序方式、角度,多種排序結(jié)合使用才能做出更合理的排序,才能使你的搜索引擎更加智能。拋磚引玉,或許你有更好的排序,請也分享給我。

------------------------------------------------------------------------------------------------------------------------------

? 實驗15:中文全文檢索

MySQL不支持中文全文檢索,因為中文一句話是連著寫的,不像英文單詞間有空格分隔。解決辦法就是中文分詞(關(guān)于中文分詞請參閱其它文章),如果你的MySQL是安裝在Windows平臺上的,可以不用轉(zhuǎn)碼直接存儲中文就可以使用全文索引,如本例。但是如果你的MySQL是安裝在Linux上的則需要進行轉(zhuǎn)編碼(urlencode / base64_encode / json_encode / 區(qū)位 / 拼音)等方案,具體方案參看其它博文。

1 2 3 SELECT?*,MATCH?(title_fc)?AGAINST?('中華?北京?和諧?security')?as?title_score,MATCH?(content_fc)?AGAINST?('中華?北京?和諧?security')?as?content_score,(case?when?MATCH?(title_fc)?AGAINST?('中華?北京?和諧?security')?>?0?and?MATCH?(content_fc)?AGAINST?('中華?北京?和諧?security')?>?0?then?'5'?when?MATCH?(title_fc)?AGAINST?('中華?北京?和諧?security')?>?0?and?MATCH?(content_fc)?AGAINST?('中華?北京?和諧?security')?=?0?then?'4'?else?'0'?end)?as?score1 ??????FROM?zzx_articles? ??????WHERE?MATCH?(title_fc,content_fc)?AGAINST?('中華?北京?和諧?security'?IN?BOOLEAN?MODE)?order?by?score1?DESC,title_score?DESC,content_score?DESC

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的MySQL中文全文检索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。