2017-07-13 14 views
0

私はそこように感じるSphinxQL変数は推奨されず、代替クエリですか?

SELECT *,@weight AS m FROM test1 WHERE MATCH('tennis') ORDER BY m DESC LIMIT 0,1000 OPTION ranker=bm25, max_matches=3000, field_weights=(title=10, content=5); 

(以下の例を参照)私はかなり簡単SphinxQLクエリだと思ったものを持っていましたが、変数が廃止され、@それが判明強さによって結果をソートする方法でなければなりませんマッチの交換は何ですか?

別の言葉では、特定の他の単語が表示された場合、その中に切り下げを含めるとどうなりますか?たとえば、「アパレル」という単語が含まれている結果の価値を評価しないとします。それは同じクエリで実行できますか?

ありがとうございます!

答えて

1

まあ結果は

SELECT * FROM test1 WHERE MATCH('tennis') LIMIT 0,1000 OPTION ... 

しかし、そうでない場合はその、ちょうど@変数は、「機能」によって置き換えられている...これだけやる、降順重量で「デフォルト」であり主な理由のようなそのより「SQL 'そう@weightは、代わりGROUPBY()WEIGHT()

SELECT * FROM test1 WHERE MATCH('tennis') ORDER BY WEIGHT() DESC ... 

又は参照@groupについて

SELECT *,WEIGHT() AS m FROM test1 WHERE MATCH('tennis') ORDER BY m DESC ... 

され、@countは、COUNT(*)@distinctあることCOUNT(DISTINCT ...)@geodistありますGEODIST(...)@exprは、実際にはequivlentを持っていません。式を直接使用するか、独自のカスタム名前の別名を使用します。


第2の質問は、キンダートリッキー、彼らは本当に '否定的な'重さではありません。 Therはキーワードブースト演算子ですが、これを使用して特に値を下げることはできません。

私はおそらくそれが機能していると思う唯一の方法は、否定一致が特定のフィールドと一致していれば、複雑なランキングのexspressionを構築できるかどうかです。基本的には負の重みとして代わりに、ランキング発現のための特定のフィールドを必要とするので、例示的な目的のために非常に基本的なデモ表現だと、その列

... MATCH('@!(negative) tennis @negative apparel') 
... OPTION ranker=expr('SUM(word_count*IF(user_weight=99,-1,1))'), field_weights(negative=99) 

を選択するために使用することができ、実際の一つは、おそらく多くのだろう複合体。 99を「負の」乗算のプレースホルダーとして使用しているだけです。 新しいnegativeフィールドを作成する必要があります。これは他のフィールドと重複している可能性があります

+0

ありがとうございます! weight()は正確に私が必要としていたものなので、後処理の追加関連性のあるものに結果を渡すことができました。 これは素晴らしいです! – user2648990

関連する問題