ti-enxame.com

Maneira correta de usar a pesquisa de texto completo do MySQL em uma string de palavras-chave?

Eu tenho uma string de palavras-chave na qual desejo fazer uma pesquisa de texto completo.

A consulta de pesquisa atual no modelo é a seguinte:

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

No entanto, isso retorna resultados de pesquisa muito ruins. Por exemplo, a cadeia de pesquisa Google Nexus 5 corresponde, enquanto Google 5 Nexus não. Qual é a maneira correta de converter esta consulta em pesquisa de texto completo no Joomla 3.3

3
user2097091

NB. este código não foi testado, digitado no navegador, portanto, ressalte o emptor

A primeira etapa seria verificar o termo de pesquisa para espaços e, em seguida, explode() ele em uma array() que contém cada uma das seqüências delimitadas por espaço. por exemplo.

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

Se você deseja apenas encontrar conteúdo com todas as palavras-chave, também precisará usar um AND em vez de um OR. A propósito, a chamada $db->quote() que você executa automaticamente uma escape() da maneira que você está usando (não tenho certeza se ele detecta o texto que escapou anteriormente com o escape extra ou não no seu caso).

Portanto, para criar seus where 's, você pode percorrer a matriz com 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.' )');
    }
}

Dito isto, isso pode ser uma carga séria no MySQL, afinal é um banco de dados relacional, e não um mecanismo de pesquisa. Você pode fazer coisas como:

  1. Dê ao usuário a opção de pesquisar em apenas uma dessas colunas
  2. Limite o número de palavras na entrada, imagine uma pesquisa com 10 ou mais palavras.
  3. Veja opções como MATCH e MATCH AGAINST
1
Craig

Estou enfrentando o mesmo problema, especialmente quando você tem grandes conjuntos de dados. Tentei também as soluções MATCH e MATCH CONTRA, mas elas não foram realmente úteis para a pesquisa de texto completo. No final, escrevi meu próprio plugin do Finder e migro minhas extensões para que a pesquisa de texto completo use pesquisa inteligente . Não sei se isso é uma opção para você.

1
Laoneo