it-swarm.it

Modo corretto di utilizzare la ricerca full-text di MySQL su una stringa di parole chiave?

Ho una stringa di parole chiave su cui voglio effettuare ricerche di testo completo.

La query di ricerca corrente nel modello è la seguente:

$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.' )');
    }

Tuttavia, questo restituisce risultati di ricerca molto scadenti. Ad esempio, la stringa di ricerca Google Nexus 5 corrisponde, mentre Google 5 Nexus non. Qual è il modo corretto di convertire questa query in ricerca full-text in Joomla 3.3

3
user2097091

NB. questo non è un codice testato appena digitato nel browser quindi avvertimento emptor

Il primo passo sarebbe quello di controllare il termine di ricerca degli spazi e poi explode() in un array() che contiene ciascuna delle stringhe delimitate da spazi. per esempio.

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

Se vuoi solo trovare contenuti che contengono tutte le parole chiave, devi anche usare un AND anziché un OR. A proposito, la chiamata $db->quote() che esegue automaticamente una escape() nel modo in cui la stai usando (non sono sicuro che rilevi il testo precedentemente salvato con l'escaping extra o non nel tuo caso).

Quindi, per creare i tuoi where potresti passare in rassegna l'array con qualcosa del tipo:

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.' )');
    }
}

Detto questo, questo potrebbe essere un grosso carico su MySQL, dopo tutto non è un motore di ricerca. Potresti voler fare cose come:

  1. Offri all'utente la possibilità di cercare solo in una di quelle colonne
  2. Limita il numero di parole in input, immagina una ricerca con 10 o più parole al suo interno.
  3. Guarda opzioni come MATCH e MATCH AGAINST
1
Craig

Sto affrontando lo stesso problema soprattutto quando si hanno set di dati di grandi dimensioni. Ho provato anche le soluzioni MATCH e MATCH CONTRO ma non sono state veramente utili per la ricerca full text. Alla fine ho scritto il mio Finder plugin e migra le mie estensioni per la ricerca full-text da usare ricerca intelligente . Non so se questa è un'opzione per te.

1
Laoneo