optimizar lentas consultas busquedas mysql laravel-4 full-text-search

lentas - Cadena de escape para usar en la búsqueda de texto completo de MySQL



busquedas en mysql (1)

Solo las palabras y los operadores tienen significado en el modo de búsqueda Boolean. Los operadores son: + , - , > < , ( ) , ~ , * , " , @distance . Después de algunas investigaciones encontré qué palabra son los caracteres: mayúsculas, minúsculas, números (dígitos) y _ . Creo que puedes use uno de dos enfoques:

  1. Reemplazar todos los caracteres que no sean palabras con espacios (prefiero este enfoque). Esto se puede lograr con regex:

    $search = preg_replace(''/[^/p{L}/p{N}_]+/u'', '' '', $keyword);

  2. Reemplazar caracteres-operadores con espacios:

    $search = preg_replace(''/[+/-></(/)~*/"@]+/'', '' '', $keyword);

Solo las palabras se indexan mediante el motor de búsqueda de texto completo y se pueden buscar. Los caracteres que no son palabras no están indexados, por lo que no tiene sentido dejarlos en la cadena de búsqueda.

Referencias

Estoy usando Laravel 4 y he configurado la siguiente consulta:

if(Input::get(''keyword'')) { $keyword = Input::get(''keyword''); $search = DB::connection()->getPdo()->quote($keyword); $query->whereRaw("MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(? IN BOOLEAN MODE)", array($search) ); }

Esta consulta funciona bien bajo uso normal, sin embargo, si el usuario ingresa una cadena como ++ , se produce un error. En cuanto a los documentos de MySQl , hay algunas palabras clave, como + y - que tienen propósitos específicos. ¿Hay alguna función que escape a estos tipos de caracteres especiales de una cadena para que pueda usarse en una búsqueda de texto completo como la anterior sin arrojar ningún error?

Aquí hay un ejemplo de un error que se produce:

{"error":{"type":"Illuminate//Database//QueryException","message":"SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected ''+'' (SQL: select * from `resources` where `duplicate` = 0 and MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(''c++'' IN BOOLEAN MODE))","file":"//var//www//html//[...]//vendor//laravel//framework//src//Illuminate//Database//Connection.php","line":555}}

Soluciones que he probado:

$search = str_ireplace([''+'', ''-''], '' '', $keyword); $search = filter_var($keyword, FILTER_SANITIZE_STRING); $search = DB::connection()->getPdo()->quote($keyword);

Asumo que necesitaré usar expresiones regulares. ¿Cuál es el mejor enfoque aquí?