web-dev-qa-db-fra.com

Recherche en texte intégral dans les messages triés par pertinence

Je construis une page de recherche personnalisée et ce dont j'ai besoin, c'est de trier les résultats par pertinence (par exemple, les occurrences d'un mot clé)

En utilisant les documents MySQL , j'ai construit cette requête:

SELECT ID
FROM $wpdb->posts
WHERE MATCH (post_title, post_content) AGAINST ('$keyword_list')
AND post_status = 'publish'
AND post_type = 'issue'

Problème A) Si je le teste à l'aide d'un ou plusieurs mots-clés qui apparaissent plusieurs fois dans mes publications de test, il recherche ces publications, mais le tri n'est pas effectué correctement par pertinence. Par exemple, le premier message trouvé contient environ 3 occurrences du mot clé, tandis que les messages renvoyés à la 3e place en contiennent environ 15.

Problème B) Deux mots contiennent le mot clé "medicare". Si je recherche "medicare", les messages sont renvoyés. Toutefois, lorsque je recherche "medi", "medic "etc. il ne retourne rien.

Existe-t-il un moyen de l'interroger à l'aide de MATCH/AGAINST ou dois-je utiliser LIKE% - dans ce cas, comment trier par pertinence.

Merci

3
Smaug

Vous pouvez vérifier le moteur de recherche Sphinx http://sphinxsearch.com/

Il m'a fallu environ une journée pour le configurer et apprendre à l'utiliser, mais le tri par pertinence et grammaire est vraiment efficace. En outre, elle est plus rapide que la recherche en texte intégral pour les grands ensembles de données grâce à l'indexation.

1
Aleh

Cela ne résoudra pas le problème B, mais en ce qui concerne le problème A: je ne pense pas que les recherches en texte intégral trient automatiquement par pertinence. Je suis à peu près sûr que vous devez sélectionner la clause "AGAINST" pour obtenir la pertinence des résultats. Comme:

... WHERE MATCH (post_title, post_content) AGAINST ('$keyword_list') as relevance ...
... ORDER BY relevance

Mais je suis aussi d’accord avec Aleh: si vous recherchez une recherche sophistiquée, vous aurez probablement besoin de quelque chose conçu à cet effet, comme Sphinx.

0
MathSmath

Cela peut être important ou non dans votre cas, mais la recherche FULLTEXT fonctionne très étrangement quand il n’ya pas beaucoup de texte. C'est vraiment pénible de pouvoir tester sur un petit ensemble de données. Vous pouvez essayer le mode booléen lorsque vous travaillez avec un petit jeu de données texte.

Tu devrais essayer...

 WHERE MATCH (post_title, post_content) 
       AGAINST ('keyword keyword keyword' IN BOOLEAN MODE)

L'argument de @ MathSmath sur l'ordre par pertinence est également correct.

0
O. Jones