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
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:
MATCH
e MATCH AGAINST
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ê.