1

ThinkingSphinx を使用して、検索する必要があるキーワードのリストがあります。それらのいくつかは他のキーワードよりも重要であり、それらの単語に重みを付ける方法を見つける必要があります。

これまでのところ、私が思いついた唯一の解決策は、クエリで同じ単語を x 回繰り返して、その関連性を高めることです。例:
3 つのキーワード、それぞれに重要度があります: 青(1) 最近(2) 楽しい(3) このクエリを実行します

MyModel.search "Blue 最近 最近 楽しい 楽しい 楽しい", :match_mode => :any

あまりエレガントではなく、かなり制限されています。誰かがより良いアイデアを持っていますか?

4

2 に答える 2

1

最近、私はSphinxを幅広く使用しており、UltraSphinxの死後、Patのすばらしいプラグインを使い始めました(Patに感謝します。まもなくメルボルンでコーヒーを購入します!)

あなたの元のアイデアに基づいて可能な解決策を見つけましたが、「実行時」ではなく「インデックス時」にデータを変更する必要があります。

これを試して:

  1. Sphinx SQLクエリを変更して、「Blue」を「Blue Blue Blue Blue」に、「Recent」を「Recent 最近のRecent」に、「Fun」を「FunFun」に置き換えます。これにより、特別なキーワードの出現が拡大されます。

    例:SELECT REPLACE(my_text_col、 "blue"、 "blue blue blue")asmy_text_col..。

    おそらく一度にすべてを実行したいので、replace呼び出しをネストするだけです。

    例:SELECT REPLACE(REPLACE(my_text_col、 "fun"、 "fun fun")、 "blue"、 "blue blue blue")as my_text_col .. ..

  2. 次に、ランキングモードをSPH_RANK_WORDCOUNTに変更します。このようにして、キーワードの頻度に最大の関連性が与えられます。

  3. (オプション)特別なキーワードに関連するキーワードのリストがあるとします。たとえば、「淡い青」は「青」関連し、「楽しい」は「楽しい」に関連します。実行時に、代わりにターゲット単語を探すようにクエリテキストを書き直します。これらの単語をハッシュに簡単に保存し、それをループして置換することができます。

# 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

これで、準キーワードクラスタリングもできました。スフィンクスは本当に素晴らしいテクノロジーです、お楽しみください!

于 2009-05-02T15:41:59.543 に答える
1

これらのキーワードを別のフィールドに入れることができれば、それらのフィールドに重みを付けて、より重要にすることができます。ただし、それは私が考えることができる唯一の良いアプローチです。

MyModel.search "Blue Recent Fun", :field_weights => {"keywords" => 100}
于 2009-04-17T05:55:57.890 に答える