2014-01-06 66 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,因此数据库优化器不能使用索引,因此以这种方式完成的查询不如预期的那么高效。