2013-08-30 3 views
1

Le code suivant fonctionne pour la recherche, mais cela ne fonctionne pas si vous entrez trop de texte dans la boîte de recherche. Par exemple, si vous recherchez l'expression «texte en anglais», vous obtenez un certain nombre de résultats. Cependant, si vous recherchez l'expression «texte en langue anglaise», elle ne donne AUCUN résultat, car le mot «langue» ne figure pas dans les champs qu'elle recherche. En d'autres termes, la requête recherche la phrase dans le texte, et pas seulement une partie de celle-ci.MySQL Recherche n'importe quel mot plutôt que TOUS les mots

J'utilise cette requête:

$sqlcommand = "SELECT id,page_title,url,search_description,text1,text2,text3 
      FROM pages 
      WHERE concat(text1, ':', text2, ':', text3) LIKE '%$searchquery%'"; 

Je cherche des conseils, mais je devine la partie LIKE '%$searchquery%' est le problème.

Vive

Richard

+3

On dirait que vous voulez vraiment la recherche en texte intégral, probablement avec l'option booléenne. Consultez la documentation pour plus d'informations (http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html). –

+0

Veuillez modifier votre question pour clarifier ce qui est recherché et ce qui est recherché. "Rechercher qui recherche un mot dans la recherche" est affreusement opaque. Cela ne fonctionne pas si vous "entrez trop de texte" - entrez le texte où? Dans vos champs de base de données ou votre chaîne '$ searchquery'? – Air

+0

Question éditée, j'espère que cela aidera à éclaircir ce que je demande. Richard –

Répondre

1

d'abord vous voulez vraiment une recherche en texte intégral pour cette.

Si pour une raison quelconque essayer de le faire avec pur SQL puis

  • première chose que vous devez faire est de vous diviser rechercher chaîne en mots
  • et filtrer les mots (pronoms, conjonctions, prépositions, etc) en utilisant une sorte de liste d'arrêt ou/et filtrer les mots moins de 2 ou 3 caractères.

Quelque chose comme cela pourrait le faire pour commencer:

$search_string = 'text in English Language'; 
$stop_list = array('in', 'on', 'I', 'me', 'he', 'she'); 
$search_words = explode(' ', $search_string); 
$keywords = array_diff($search_words, $stop_list); 

Vous obtiendrez dans $keywords

 
array(3) { 
    [0]=> 
    string(4) "text" 
    [2]=> 
    string(7) "English" 
    [3]=> 
    string(8) "Language" 
} 

Maintenant, ayant un réseau de mots-clés que vous pouvez construire une requête comme celui-ci

SELECT id, page_title, url, search_description, text1, text2, text3, 
     (text LIKE '%text%') + 
     (text LIKE '%English%') + 
     (text LIKE '%language%') rank 
    FROM 
(
    SELECT id, page_title, url, search_description, text1, text2, text3, 
     CONCAT_WS(' ', text1, text2, text3) text 
    FROM pages p 
) q 
WHERE text LIKE '%text%' 
    OR text LIKE '%English%' 
    OR text LIKE '%language%' 
HAVING rank > 1 -- play with cut-off rank value to get most relevant results 
ORDER BY rank DESC 

Exemple de sortie:

 
+------+------------+------+--------------------+-------+------------+-----------------+---------------------------------+------+ 
| id | page_title | url | search_description | text1 | text2  | text3   | text       | rank | 
+------+------------+------+--------------------+-------+------------+-----------------+---------------------------------+------+ 
| 3 | page3  | url3 | NULL    | text | English | language  | text English language   | 3 | 
| 1 | page1  | url1 | NULL    | text | in English | text in English | text in English text in English | 2 | 
+------+------------+------+--------------------+-------+------------+-----------------+---------------------------------+------+ 

Note: cette requête sera lente et voie de manière moins fonctionnelle que toute solution FTS.

est ici SQLFiddle démo

+0

@Richard_Bedford Était-ce utile? – peterm

Questions connexes