0

製品データベースでの検索とフィルタリングに SphinxQL を使用し、各ユーザーの最後の x 検索フレーズを保存します。すべての製品 (すべての行) をすべてのユーザーに表示できますが、以前の検索との関連性はあるのでしょうか。

たとえば、あるユーザーが携帯電話 (iphone、galaxy s7...) を検索したとします。エレクトロニクス部門。彼にすべての製品をランダムに表示したいのですが、エレクトロニクス カテゴリの製品をより頻繁に表示し、これらの検索キーワードを含む製品をより頻繁に表示します。

Sphinxでも可能ですか?

英語のおかげで申し訳ありません。

4

2 に答える 2

1

Sphinx には、それを行うための「モード」がありません。しかし、非常に接近することができます...

MAYBE 演算子を使用できます

MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)')

複雑なのは、すべての製品を一致させる方法が必要なことです。データによっては、使用できる単語 (たとえば、すべての製品で「the」のような単語) が既にある場合や、インデックス作成中にその単語をすべてのドキュメントに追加する場合があります。

... MAYBE を使用すると、一致する結果の重みを高くすることができます。

ただし、厳密に重量でソートする必要はありません。したがって、結果を少しシャッフルするための別のアルゴリズムが必要です(「ランダム」が本当に必要ないためです!)

SELECT id, IDIV(id/10000) AS int,WEIGHT() AS w 
FROM index WHERE MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)') 
ORDER BY int DESC, w DESC;

これにより、ID によるバンディングが作成されます。理論的には、結果がすべての ID 空間に分散される可能性があり、結果が少し混ざり合う可能性があります。ただし、カテゴリの結果は、各バンド内で最初に表示される傾向があります。

ID 以外の別の属性が 1 つある場合は、より良いものになる可能性があります。または、結果に意図的なランダム属性を追加できます)

... あらゆる種類のバリエーションがあります。あなたの想像力が唯一の制限です。この基本的なテクニックを使用して、物事を少し混ぜ合わせることができます。

(他の可能性もあります。Sphinx のあまり知られていない GROUP N BY 関数を使用して、サンプリング検索結果を生成できます。これはランダムではありませんが、同様の十分な結果が得られる可能性があります。つまり、結果を混同するだけです)

于 2016-04-28T18:14:35.403 に答える
1

別の方法として、各結果に乱数を付加することも考えられます。範囲が重複する高い数値と低い数値。

sql_query = SELECT id, RAND()*100 AS rand_low, (RAND()*100)+50 AS rand_high, ...
sql_attr_uint = rand_low
sql_attr_uint = rand_high

次に、ランキング式を調整して、一致するかどうかに応じてこれらの数値のいずれかを選択し、結果で並べ替えることができます。

SELECT id FROM index WHERE MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)') 
OPTION ranker=expr('IF(doc_word_count>1,rand_high,rand_low)');

混みます。ただし、単語の 1 つに一致する結果は、最初に表示される可能性が高くなります (加重乱数を使用するため)。rand_high が rand_low よりも小さい可能性があるため、これは可能性にすぎません。... 数値「重複」のサイズを変更して、一致する結果と一致しない結果の組み合わせを微調整できます。

(同じ「all」キーワードを使用していますが、まったく異なるアイデアとして新しい回答として追加されました)

于 2016-04-29T18:08:52.810 に答える