第一篇:MySQL中文模糊搜索解決方案
在 MySQL下,在進行中文模糊檢索時,經(jīng)常會返回一些與之不相關(guān)的記錄,如查找 “%a%” 時,返回的可能有中文字符,卻沒有a字符存在。本人以前也曾遇到過類似問題,經(jīng)詳細閱讀MySQL的Manual,發(fā)現(xiàn)可以有一種方法很方便的解決并得到滿意的結(jié)果。例子:
希望通過“標題”對新聞庫進行檢索,關(guān)鍵字可能包含是中英文,如下SQL語句:QUOTE:
select id,title,name from achech_com.news where title like '%a%'
返回的結(jié)果,某些title字段確定帶了“a”關(guān)鍵字,而有些則只有中文,但也隨之返回在檢索結(jié)果中。
解決方法,使用 BINARY 屬性進行檢索,如:
QUOTE:
select id,title,name from achech_com.news where binary title like '%a%'
返回的結(jié)果較之前正確,但英文字母區(qū)分大小寫,故有時在檢索如“Achech”及“achech”的結(jié)果是不一樣的。知道了使用 BINARY 屬性可以解決前面這個問題,再看看 MySQL 支持的UCASE 及 CONCAT 函數(shù),其中 UCASE 是將英文全部轉(zhuǎn)成大寫,而CONCAT函數(shù)的作用是對字符進行連接,以下是我們完全解決后的SQL 語句:
QUOTE:
select id,title,name from achech_com.news
where binary ucase(title)like concat('%',ucase('a'),'%')
檢索的步驟是先將屬性指定為 BINARY,以精確檢索結(jié)果,而被 like 的 title內(nèi)容存在大小寫字母的可能,故先使用 ucase 函數(shù)將字段內(nèi)容全部轉(zhuǎn)換成大寫字母,然后再進行 like 操作,而 like 的操作使用模糊方法,使用 concat的好處是傳進來的可以是直接的關(guān)鍵字,不需要帶“%”萬用符,將“'a'”直接換成你的變量,在任何語言下都萬事無憂了。當然你也可以這么寫:
QUOTE:
select id,title,name from achech_com.news where binary ucase(title)like ucase('%a%')
檢索的結(jié)果還算滿意吧,不過速度可能會因此而慢N毫秒
第二篇:PHP MySql亂碼解決方案
PHP亂碼?Mysql亂碼?怎么解決?
PHP亂碼或者mysql亂碼,多半是因為沒有統(tǒng)一編碼,要解決PHP/mysql亂碼,只要做到三碼合一即可.所謂三碼,是指文件編碼,頁面編碼聲明和數(shù)據(jù)庫字符集,要使用相同的編碼,如全部為utf-8.怎么做到三碼合一?下面以utf-8為例,說明如何統(tǒng)一編碼.1.網(wǎng)頁文件編碼保存為utf-8無BOM
記事本,保存文件的時候選擇“編碼”為utf-8
editPlus,保存時選擇“encoding”為utf-8
UEStudio保存時選擇“格式”為utf-8無BOM
2.PHP頁面內(nèi)部使用header('Content-type : text/html;Charset=UTF-8');聲明頁面編碼為utf-8
在html頭部寫入來聲明頁面編碼為utf-8
3.PHP頁面中連接數(shù)據(jù)庫服務(wù)器后執(zhí)行sql查詢前使用以下代碼先將字符集設(shè)置為utf-8 mysql_query('SET NAMES utf8');[或mysqli,具體代碼這里不再寫了]
4.創(chuàng)建數(shù)據(jù)表的時候?qū)⒛J編碼設(shè)置為utf8,將字符校對(callate)設(shè)置為utf8_general_ci CREATE TABLE IF NOT EXISTS `name`(....代碼....)ENGINE InnoDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci
做到這四點,相信你的網(wǎng)頁和數(shù)據(jù)庫不會再亂碼.
第三篇:搜索關(guān)聯(lián)詞解決方案
想找到一個好的同義詞解決方案,在javaeye搜此類信息也求不到,后來發(fā)了個提問貼也只有瀏覽數(shù)而無回復(fù),不知道這是什么原因,搜索關(guān)聯(lián)詞解決方案。
所謂近義詞、關(guān)聯(lián)詞檢索不外乎以下三種形式:
1.類似google suggest,用戶輸入關(guān)鍵字后自動提示功能。
2.假如“奧運會”的關(guān)聯(lián)詞是“北京”,用戶輸入“奧運會”搜索時,將“奧運會”的搜索結(jié)果以及“北京”的搜索結(jié)果都搜出來。
3.用戶輸入“奧運會”搜索,只顯示“奧運會”的結(jié)果,它的關(guān)聯(lián)詞在結(jié)果集的底端用“相關(guān)搜索”的形式提示給用戶。
這三種方式中看似2和3是類似的,其實還是有些很大區(qū)別的,我個人認為在實際的應(yīng)用中,第3種方式是最多見的。
先說說第1種方式
google suggest的在網(wǎng)上可以搜到完整的解決方案,跟我此前想的一樣。
建一個用來存儲關(guān)鍵字的表
例如:
Sql代碼
create tableKEYS(ITEM_ID varcha2(50)not null,SEARCH_KEY varchar2(100),);SEARCH_KEY里存儲一些檢索的關(guān)鍵字,如“奧運”,“奧運會”,“北京奧運會”等.當用戶在文本框敲入時,使用AJAX將當前文本框的內(nèi)容發(fā)到Action,進行下面類似的操作
Java代碼
String key = request.getparameter(“inputValue”);String sql = “select * from KEYS as k where k.SEARCH_KEY like '%key%'”;這個辦法也就是把當前文本框中的字放到數(shù)據(jù)庫中做模糊查詢,比如用戶輸入“奧”這個字,會從搜出所有包含“奧”字的詞,然后將這些詞包裝好,發(fā)回至頁面,頁面上用JS畫出下拉框,將這些包含“奧”字的詞填入就可以了。
google做的是右邊匹配,即是用的 like 'key%' ,輸入“奧”字,會出現(xiàn)所有以“奧”字開頭的詞的提示。
大家應(yīng)該注意到google suggest的提示詞的最后面都寫有“約XXXXX條記錄”,我現(xiàn)在唯一能想到的解決方案是,當我們在Action中拿到匹配的詞之后,將匹配的詞搜索一次即可得出具體記錄的條數(shù),其實這樣也不耗多少資源。
第2種方式
將關(guān)鍵詞和關(guān)鍵詞所聯(lián)的詞的結(jié)果都搜出來
我個人認為這個功能在實際的應(yīng)用中只需用到其5%就可以了,因為在用戶體驗方面考慮,我們必須保障搜索結(jié)果的質(zhì)量。關(guān)鍵詞的近義詞可以在結(jié)果頁的底端提示給用戶,也就是我上邊說到的第3種方式。
我所說的只需用到5%的意思是只需為少數(shù)的、必須轉(zhuǎn)義的詞實現(xiàn)這樣的功能
比如搜索“China”,那么“中國”這個詞的結(jié)果肯定得出現(xiàn)在結(jié)果集里,還有比如搜索“08”,那么“2008”的結(jié)果也得出現(xiàn)在結(jié)果集里,這些都是一些特定情況,其它的詞沒必要做成這樣,只需做提示即可。
現(xiàn)在中文檢索一般都是基于詞庫的檢索,實現(xiàn)第2種方式這個功能必須將之前的詞庫以及分詞算法進行修改。
一般的方法是在詞庫中把同義詞寫成一行,如將“中國 China”寫在同一行,然后修改Token算法(這個大家可以去研究一下,我現(xiàn)在使用的Analyzer包是公司商業(yè)上的伙伴提供的測試包,這個測試包已經(jīng)可以滿足很大一部分需求了,我還不知道能不能共享)
其實原理是在索引時將原詞和原詞的近義詞一起索引
具體給大家個例子
有這樣一句話----“中國是世界上人口最多的國家”
如果沒有為其做同義詞,大家可能會索引成這樣
如果做了同義詞,會索引成即是說在索引時就已經(jīng)將“中國”這個詞存成了,搜索時無論搜“中國”或是“China”都可以搜到這句話,規(guī)劃方案《搜索關(guān)聯(lián)詞解決方案》。
其實這個功能相當大一部分是依賴第三方的jar包,說來說去也沒多大意思,并且大多數(shù)情況下我們需要的并不同這種功能,而是更人性化的查詢提示的功能,也就是第3種方式。
第3種方式
這種方式是我在原有的系統(tǒng)上改進完成的原有的系統(tǒng)是 compass + paoding + lucene
由于我不太熟compass的搜索,所以我還是采用的lucene搜索。相信大家對這種搭配的全文檢索已經(jīng)非常熟悉了,paoding的詞庫是可以自己配置的。
那么怎樣在原有的基礎(chǔ)實現(xiàn)關(guān)鍵詞提示功能呢???
我的做法是這樣的,我按照paoding詞庫的特點新建了一個mydictionary.dic文件放在classpath下,里面的內(nèi)容大致如下。
第1行:奧運會北京2008第29屆奧運會
第2行:中國 China 中華人民共和國 中國電信 中國人民銀行
........然后在服務(wù)器啟動時,將mydictionary.dic這個文件中的文字一行行讀入,分別做索引
Java代碼
InputStream fi = this.getClass().getClassLoader().getResourceAsStream(“mydictionary.dic”);File indexDir = new File(“d:tong”);Analyzer luceneAnalyzer = new StandardAnalyzer();IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,true);BufferedReader reader = new BufferedReader(new InputStreamReader(fi, “UTF-8”));String line = new String();while((line = reader.readLine())!= null){Document document = new Document();Field FieldName = new Field(“l(fā)ine”, line,Field.Store.YES, Field.Index.TOKENIZED);document.add(FieldName);indexWriter.addDocument(document);}indexWriter.optimize();indexWriter.close();reader.close();
在搜索時,對用戶輸入的關(guān)鍵字正常搜索出結(jié)果后,對關(guān)鍵字進行第二次搜索,搜的是同義詞的索引,得到的結(jié)果按空格分開,即可得到所有同義詞,然后將同義詞發(fā)送至頁面即可。
Java代碼
public List getTongYi(String searchword)throws Exception{List list = new ArrayList();Hits hits = null;String queryString = searchword;Query query = null;String result = “";IndexSearcher searcher = new IndexSearcher(”d:tong“);Analyzer analyzer = new StandardAnalyzer();Queryparser qp = new Queryparser(”line“, analyzer);query = qp.parse(queryString);if(searcher!= null){hits = searcher.search(query);for(int i=0;i 遠程客戶端連接MysqL數(shù)據(jù)庫太慢解決方案 遠程客戶端連接MysqL數(shù)據(jù)庫太慢解決方案 局域網(wǎng)客戶端訪問mysql 連接慢問題解決。 cd /etc/mysql vi my.conf [mysqld] skip-name-resolve 此選項禁用了DNS解析,連接速度會快很多。 不過,這樣的話就不能在MySQL的授權(quán)表中使用 主機名了而只能用ip格式。 問題1: 在使用tomcat服務(wù)器時,如在跳轉(zhuǎn)路徑中傳遞中文參數(shù)會出現(xiàn)亂碼現(xiàn)向!如:以 和第四篇:遠程客戶端連接MysqL數(shù)據(jù)庫太慢解決方案
第五篇:中文參數(shù)亂碼問題解決方案
解決:在tomcat/conf/servlet.Xml中 加入一段代碼:
debug=“0” connectionTimeout=“20000” disableUploadTimeout=“true” URIEncoding=“true”/> 問題2: 如果uri中轉(zhuǎn)遞的是參數(shù)要發(fā)送到j(luò)sp頁面,則必須在接受代碼的jsp頁面里面還要加入代碼: <% request.setCharacterEncoding(“gb2312”);%> 問題3: 在jsp頁面里的代碼修正: <%@ page language=“java” import=“java.util.*” pageEncoding=“gb2312”%> <%@ page contentType=“gb2312”%>