2011-08-25 8 views
3

J'utilise Sphinx pour effectuer une recherche sur un site Web et j'ai rencontré des difficultés en retournant des résultats pertinents.Sphinx recherche des correspondances exactes puis infixe des correspondances

Pour garder ma question simple, supposons que j'ai deux champs, @title et @body, qui sont pondérés respectivement 100 & 15. Quand je cherche des petits mots comme le mot «dans Je voudrais avoir un rang correspond exactement à ce terme de recherche plus élevé et puis chèque de matchs à « en * | * en | * dans * » et les classer légèrement plus bas. Est-il possible d'avoir ce type de spécificité pour vos recherches?

Exemple de résultats pour 'dans':

  1. Indian Food
  2. Dans Le Moyen
  3. document sur le latin

Certains paramètres pertinents sont les suivants:

En sphinx.conf:

morphology    = stem_en 
charset_type   = utf-8 
min_word_len   = 2 
min_prefix_len   = 0 
min_infix_len   = 2 
enable_star    = 1 

Dans search.php

$sp->SetMatchMode(SPH_MATCH_EXTENDED2); 
$sp->SetRankingMode(SPH_RANK_PROXIMITY_BM25); 
$sp->SetFieldWeights (array('title' => 100, 'body' => 15)); 

En outre, comme une note de côté: J'ai eu aussi des cas où des correspondances partielles ne sont même pas apparaître dans les résultats de la recherche. Par exemple, j'ai cherché Cow mais Cowboy ne se est pas présenté comme résultat. J'ai aussi cherché cowb et Cowbo et ce ne est que je tapais Cowboy que j'ai reçu le résultat attendu. Des pensées?


Cette question est dans le même sens que this previous SO question, mais je l'espère, je l'ai donné un peu plus de détails à mon problème et les choses que j'ai essayé de justifier une solution.

+0

Y at éléments supplémentaires que je pourrais ajouter à aider les gens à répondre à cette question? – ServAce85

Répondre

3

Apparemment morphologiquement Cow n'est pas lié à Cowboy.

Vous pouvez résoudre de deux façons:

  1. Utilisez wordforms fichier avec la vache> Cowboy
  2. Comme étoiles est activé, vous pouvez changer la requête de « vache » à « vache * » qui trouvera tous les mots commençant par "Vache".

Regard différent pour le classement « dans » et « dans » Je pourrais suggérer d'avoir deux champs de corps dans l'index, permet de dire: le corps et body_star avec le même contenu du champ de corps.

dans la recherche.php

$sp->SetRankingMode(SPH_RANK_PROXIMITY_BM25); 
$sp->SetMatchingMode(SPH_MATCH_EXTENDED2); 
$sp->SetFieldWeights (array('title' => 20, 'body' => 15, 'body_start' => 5)); 
$sp->Query("@body in @body_star *in* @title in"); 

Cela devrait faire l'affaire.

+0

J'aime lire une solution qui semble élégante. Je vais devoir jouer un peu avec le problème du "cow-boy", mais j'aime vraiment votre suggestion quant à la façon de résoudre le problème "in". Bonne suggestion! (c'est-à-dire ... jusqu'à ce que quelqu'un vienne et me dise différemment;) Je l'accepterai comme la bonne réponse quand je la testerai en supposant que cela fonctionne. – ServAce85

Questions connexes