2014-01-06 5 views
1

При создании текстового поиска в веб-сайт я передаю его через петлю PHP:Игнорировать определенные символы в DB2 ЗЕЬЕСТЕ

$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 для соответствия этому регулярному выражению, например, если есть элемент с именем «FellerCo Unicorn Repellerant # 123», затем поиск «fakecos unicorn repellant 123 "должен дать результат, игнорируя тот факт, что существуют" "и" # ". На самом деле из-за структуры списка «123 fakeco» должен также показать результат.

Есть ли способ применить регулярное выражение к оператору DB2?

Это время бежал против DB2 для I (версия 7.1)

Edit: попытка решения (вставить это раньше 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 ?"; 

Эффективно это было заменить (заменить (заменить (query, '!', ''), '@', ''), '#', '') для каждого поля, только оберните еще несколько заметок вокруг этого. Я перестала преследовать эту идею, когда увидела, какое влияние она оказывает на производительность. Я поговорю с нашими разработчиками RPG о решении UDF, предложенном Баком Калабро. Это похоже на единственное «реальное» решение.

+1

Задумывались ли Вы о отображение данных с помощью специального двигателя, таких как фантастический [ElasticSearch] (http://www.elasticsearch.org)? Будучи Java, он даже будет запускаться изначально на IBM i. – jamesallman

ответ

1

Так как вы имеете дело с IBM я версии 7.1, лучшим решением ИМО будет получить DB2 OmniFind Text Search Server (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), который имел почти такую ​​же функциональность, но это было не так приятно использовать.

НТН,

Чарльз

+0

Удивительно, это даже превосходит решение регулярных выражений – MaKR

+0

Рад, что вы сочли это полезным, вы можете пометить мой ответ как принятый ответ. Вы также можете рассмотреть вопрос об изменении заголовка вопроса. – Charles

2

Как отмечает @JamesA, начиная с версии 7.1 в выражении WHERE нет поддержки регулярного выражения. Это не означает, что кто-то не написал определенную пользователем функцию для ее реализации. Деннис Ловелади поделился своей идеей в списке рассылки Midrange dot com по адресу http://archive.midrange.com/midrange-l/201209/msg00810.html Это написано в RPG, поэтому вам нужно будет заставить одного из программистов IBM i загрузить его для вас. Поскольку это UDF, оптимизатор базы данных не может использовать индекс, поэтому запросы, выполненные таким образом, не так эффективны, как можно было бы ожидать.

 Смежные вопросы

  • Нет связанных вопросов^_^