2009-04-16 5 views
1

J'ai une liste de mots-clés que je dois rechercher contre, en utilisant ThinkingSphinx Certains d'entre eux étant plus importants que d'autres, je dois trouver un moyen pour peser ces mots. Jusqu'ici, la seule solution que j'ai trouvée est de répéter x nombre de fois le même mot dans ma requête pour augmenter sa pertinence. Par exemple:
3 mots-clés, chacun d'eux ayant un niveau d'importance: Bleu (1) récente (2) Divertissement (3) Je lance cette requêteSphinx, Rails, ThinkSphinx et en faisant quelques mots plus important que d'autres dans votre requête

MyModel.search "Bleu récent Fun Fun Fun", : match_mode =>: any

Pas très élégant et assez limitant. Est-ce que quelqu'un a une meilleure idée?

Répondre

1

Si vous pouvez placer ces mots clés dans un champ distinct, vous pouvez pondérer ces champs pour qu'ils soient plus importants. C'est à peu près la seule bonne approche à laquelle je peux penser.

MyModel.search "Blue Recent Fun", :field_weights => {"keywords" => 100} 
+1

N'aurais-je pas toujours le même problème? dans ce cas, les mots-clés auraient plus de poids que, disons, le champ de titre. Mais ce que je suis en train de faire, c'est de rendre le mot clé plus important que le mot clé dans la requête. –

1

Récemment, je l'ai utilisé Sphinx largement, et depuis la mort de UltraSphinx, je commencé à utiliser le plugin grand Pat (Merci Pat, je vais vous acheter un café à Melbourne bientôt!)

I voir une solution possible basée sur votre idée originale, mais vous devez apporter des modifications aux données à "l'heure de l'index" pas à "l'heure d'exécution".

Essayez ceci:

  1. Modifier votre Sphinx requête SQL pour remplacer "Blue" avec "Bleu Bleu Bleu Bleu", "récente" avec "Récent récent" et "Fun" avec « Fun Amusement". Cela va amplifier toutes les occurrences de vos mots-clés spéciaux.

    par exemple. SELECT REPLACE (my_text_col, "bleu", "bleu bleu bleu") comme my_text_col ...

    Vous souhaitez probablement les faire tous en même temps, imbriquez simplement les appels de remplacement.

    par exemple. SELECT REPLACE (REMPLACER (my_text_col, "fun", "fun fun"), "bleu bleu bleu" "bleu") comme my_text_col ...

  2. Ensuite, changer le mode de classement à SPH_RANK_WORDCOUNT. De cette façon, la pertinence maximale est donnée à la fréquence des mots-clés. (Facultatif) Imaginez que vous ayez une liste de mots-clés en rapport avec vos mots-clés spéciaux . Par exemple "bleu pâle" se rapporte à "bleu" et "agréable" se rapporte à "amusant". Lors de l'exécution, réécrivez le texte de la requête pour rechercher le mot cible à la place. Vous pouvez stocker ces mots facilement dans un hachage, puis passer en boucle pour faire les remplacements.

# Add trigger words as the key, 
# and the related special keyword as the value 
trigger_words = {} 
trigger_words['pale blue'] = 'blue' 
trigger_words['pleasant'] = 'fun' 

# Now loop through each query term and see if it should be replaced 
new_query = "" 
query.split.each do |word| 
    word = trigger_words[word] if trigger_words.has_key?(word) 
    new_query = new_query + ' ' word 
end 

Maintenant vous avez quasi mot-clé cluster aussi. Sphinx est vraiment une technologie fantastique, profitez-en!

+0

Cela a fait l'affaire pour nous. En substance ce que vous voulez faire est "double" (ou plus?) L'occurance des mots-clés que vous voulez mettre plus de poids. Résolu notre problème. –

Questions connexes