2009-04-16 5 views
1

Ich habe eine Liste von Schlüsselwörtern, gegen die ich suchen muss, mit ThinkingSphinx Einige von ihnen sind wichtiger als andere, ich muss einen Weg finden um diese Worte zu gewichten.Sphinx, Rails, ThinkSphinx und machen einige Wörter wichtiger als andere in Ihrer Abfrage

Bis jetzt ist die einzige Lösung, die ich gefunden habe, x das gleiche Wort mehrmals in meiner Abfrage zu wiederholen, um seine Relevanz zu erhöhen. ZB:
3 Schlüsselwörter, jeder von ihnen ein Maß an Bedeutung aufweist: Blau (1) Neue (2) Fun (3) Ich betreibe diese Abfrage

MyModel.search "Blue Neueste Neueste Fun Fun Fun", : match_mode =>: any

Nicht sehr elegant, und ziemlich begrenzend. Hat jemand eine bessere Idee?

Antwort

1

Wenn Sie diese Schlüsselwörter in ein separates Feld eingeben können, können Sie diese Felder mit einem höheren Gewicht versehen. Das ist aber der einzig gute Ansatz, den ich mir vorstellen kann.

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

Hätte ich nicht immer das gleiche Problem? In diesem Fall hätten Keywords mehr Gewicht als beispielsweise das Titelfeld. Aber ich versuche tatsächlich, keyword1 wichtiger als keyword2 in der Abfrage zu machen. –

1

Kürzlich habe ich ausführlich Sphinx benutze, und seit dem Tod von UltraSphinx, begann ich Pats großes Plugin (Danke Pat, werde ich Ihnen einen Kaffee in Melbourne kaufen bald!)

I Sehen Sie sich eine mögliche Lösung an, die auf Ihrer ursprünglichen Idee basiert, aber Sie müssen die Daten zu "Indexzeit" und nicht "Laufzeit" ändern.

Try this:

  1. ändern Sie bitte Ihre Sphinx SQL-Abfrage "Blue" mit "Blau Blau Blau Blau", "Recent" mit "Recent Recent Recent" und "Fun" mit „Fun ersetzen Spaß". Dies vergrößert jedes Vorkommen Ihrer speziellen Schlüsselwörter.

    z.B. SELECT REPLACE (my_text_col, "blau", "blau blau blau") als my_text_col ...

    Sie wahrscheinlich sie alle auf einmal tun wollen, so dass nur das Nest Anrufe ersetzen.

    z.B. SELECT REPLACE (ERSETZEN (my_text_col, "Spaß", "fun fun"), "blau", "blau blau blau") als my_text_col ...

  2. Als nächstes Ihren Ranking-Modus ändern, um SPH_RANK_WORDCOUNT. Auf diese Weise wird der Häufigkeit der Schlüsselwörter maximale Relevanz gegeben.

  3. (Optional) Stellen Sie sich vor, Sie haben eine Liste von Schlüsselwörtern, die sich auf Ihre speziellen Schlüsselworte beziehen. Zum Beispiel "hellblau" bezieht sich auf "blau" und "angenehm" bezieht sich auf "Spaß". Schreiben Sie den Abfragetext zur Laufzeit neu, um stattdessen nach dem Zielwort zu suchen. Sie können diese Wörter einfach in einem Hash speichern und dann durchlaufen, um die Ersetzungen vorzunehmen.

# 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 

Jetzt haben Sie auch quasi-Keyword-Clustering. Sphinx ist wirklich eine fantastische Technologie, viel Spaß!

+0

Das hat den Trick für uns gemacht. Was Sie im Wesentlichen tun möchten, ist "double" (oder mehr?) Das Auftreten der Keywords, die Sie mehr Gewicht legen möchten. Hat unser Problem gelöst. –

Verwandte Themen