2014-01-06 65 views
1

某些字符當建立一個文本搜索到一個網站,我將其通過PHP循環:忽略DB2 SELECT語句

$queryList=explode(' ', $queryString); 
foreach ($queryList as $queryParm) { 
    foreach ($fields as $key => $query) { 
     $whereStr.=($key == 0) ? " AND (ucase($query) LIKE ?" : " OR ucase($query) LIKE ?"; 
     $db->parms[]="%$queryParm%"; 
     if ($key+1 == count($fields)) $whereStr.=")"; 
    } 
} 

這將分開查詢的話,使每一個單獨的參數。我正在構建一個正則表達式,只允許字母數字加空格,但現在問題是我需要SQL來匹配這個正則表達式,例如如果有一個項目名爲「FakeCo的獨角獸推斥劑#123」,然後搜索「fakecos獨角獸驅蟲劑123「應該產生結果,忽略」'「和」#「存在的事實。實際上由於清單的結構「123 fakeco」也應該顯示結果。

有沒有辦法將正則表達式應用於DB2語句?

這是被撞上了DB2對我(版本7.1)

編輯:嘗試性解決方案(插入這個PHP上述前),一些字符造成&不得不被刪除,表現不佳的時候它沒有運行

問題
$sqlNeedsEscape=array("?", "'"); 
$ignoreChars="'\"[email protected]#$%^&*()-=+[]{}|<>,./\\"; 
$ignoreChars=str_split($ignoreChars); 
$whereBefore=''; 
$whereAfter=''; 
foreach ($ignoreChars as &$ic) { 
    if (in_array($ic, $sqlNeedsEscape)) $ic="'$ic"; 
    error_log($ic); 
    $whereBefore.="replace("; 
    $whereAfter.=",'$ic','')"; 
} 

然後$whereStr.=線改變爲:

$whereStr.=($key == 0) ? " AND (ucase(trim($whereBefore $query $whereAfter)) LIKE ?" : " OR $whereBefore ucase(trim($query)) $whereAfter LIKE ?"; 

有效它被更換(更換(替換(查詢,'!',''),'@',''),'#',''),只能包括幾個替換。當我看到它對性能的影響時,我不再追逐這個想法。我會和我們的角色扮演開發者討論Buck Calabro建議的UDF解決方案。這聽起來像是唯一可能的「真實」解決方案。

+1

你想過使用專用引擎的數據映射如奇妙[ElasticSearch](http://www.elasticsearch.org)?作爲Java,它甚至可以在IBM i上本地運行。 – jamesallman

回答

1

既然你處理的IBM i 7.1版本,最好的辦法國際海事組織將得到DB2的OmniFind文本搜索服務器(5733-OMF)產品加載中...

總之OMNIFIND提供「高速度語言文字搜索「;所以搜索鼠標不僅會發現任何包含鼠標的東西,而且還會發現任何包含鼠標的東西。

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frzash%2Frzashkickoff.htm http://www-304.ibm.com/partnerworld/wps/servlet/ContentHandler/whitepaper/i/omnifind/search

這是一個免費的授權產品。請注意,它也適用於6.1。

除了提供CONTAINS()函數,還有一個SCORE()函數,可以讓您對搜索結果進行排名。

之前6。1,IBM提供了一個名爲(DB2 Extender)文本搜索引擎(5770-DE1)的收費產品,它具有很多相同的功能,但不如使用它的好。

HTH,

查爾斯

+0

驚人的,這甚至擊敗了正則表達式解決方案 – MaKR

+0

很高興你發現它很有用,你可能想要將我的答覆標記爲已接受的答案。您也可以考慮更新問題標題。 – Charles

2

作爲@JamesA注意到,從7.1開始,在WHERE子句中不支持正則表達式。這並不意味着有人沒有編寫用戶定義函數來實現它。 Dennis Lovelady在Midrange dot com郵件列表中分享了他的想法http://archive.midrange.com/midrange-l/201209/msg00810.html它是用RPG編寫的,所以你需要讓IBM的一名程序員爲你加載它。由於這是一個UDF,因此數據庫優化器不能使用索引,因此以這種方式完成的查詢不如預期的那麼高效。