it-swarm-es.tech

¿Forma correcta de usar la búsqueda de texto completo MySQL en una cadena de palabras clave?

Tengo una cadena de palabras clave en la que quiero hacer una búsqueda de texto completo.

La consulta de búsqueda actual en el modelo es la siguiente:

$jinput = JFactory::getApplication()->input;
    $keyword = $jinput->get('keyword', '', 'NULL');
    if($keyword!=''){
         $keyword = $db->Quote('%' . $db->escape($keyword, true) . '%');
            $query->where('( a.title LIKE '.$keyword.'  OR  a.features LIKE '.$keyword.'  OR  a.brand LIKE '.$keyword.' )');
    }

Sin embargo, esto devuelve resultados de búsqueda muy pobres. Por ejemplo, la cadena de búsqueda Google Nexus 5 coincide, mientras que Google 5 Nexus no. ¿Cuál es la forma correcta de convertir esta consulta a búsqueda de texto completo en Joomla 3.3?

3
user2097091

NB. este no es un código probado que simplemente se ingresó en el navegador, por lo que se debe advertir

El primer paso sería verificar el término de búsqueda para espacios y luego explode() it en un array() que contiene cada una de las cadenas delimitadas por espacios. p.ej.

$keywordArray = explode(" ", $keyword);

Si desea solo encontrar contenido que tenga todas las palabras clave, entonces también debe usar un AND en lugar de un OR. Por cierto, la llamada $db->quote() que realiza automáticamente realiza una escape() la forma en que la está utilizando (no estoy seguro de si detecta el texto previamente escapado con el escape adicional o no en tu caso).

Entonces, para construir sus where 's, puede recorrer la matriz con algo como:

if($keyword!=''){
    $keywordArray = explode(" ", $keyword);

    foreach ($keywordArray as $keyword)
    {
        $searchTerm = $db->Quote('%' . $keyword . '%');
        $query->where('( a.title LIKE '.$searchTerm.' AND a.title LIKE '.$searchTerm.' AND a.title LIKE '.$searchTerm.' )');
        $query->where('( a.features LIKE '.$searchTerm.' AND a.features LIKE '.$searchTerm.' AND a.features LIKE '.$searchTerm.' )');
        $query->where('( a.brand LIKE '.$searchTerm.' AND a.brand LIKE '.$searchTerm.' AND a.brand LIKE '.$searchTerm.' )');
    }
}

Dicho esto, esto podría ser una carga seria en MySQL, después de todo, es una base de datos relacional, no un motor de búsqueda. Es posible que desee hacer cosas como:

  1. Ofrezca al usuario la opción de buscar solo en una de esas columnas
  2. Limite el número de palabras en la entrada, imagine una búsqueda con 10 o más palabras.
  3. Mira opciones como MATCH y MATCH AGAINST
1
Craig

Me enfrento al mismo problema, especialmente cuando tienes grandes conjuntos de datos. También probé las soluciones MATCH y MATCH CONTRA, pero no fueron realmente útiles para la búsqueda de texto completo. Al final escribí mi propio complemento Finder y migro mis extensiones para la búsqueda de texto completo para usar búsqueda inteligente . No sé si esta es una opción para ti.

1
Laoneo