2

次の形式のドキュメントがあるとします。

product_name TEXT tags TAG score NUMERIC 

[product1, [tag1, tag2, tag3], 10]
[product2, [tag2, tag3, tag4], 100]
....

製品スコアの合計が最も高い順にタグを返すクエリと、各タグの上位 5 つの製品を返すクエリが必要です。

[tag3, 110, [product2, product 1]]
[tag2, 110, [product2, product 1]]
[tag4, 100, [product2]]
[tag1, 10, [product 1]]

これまでのところ、各製品/タグ キーを個別に (タグごとに繰り返し) 保存しているため、製品ごとにタグごとに 1 つの個別のドキュメントがあり、ID は製品名とタグの組み合わせですproduct_name TEXT tag TAG score NUMERIC。これで、集計クエリを実行して上位のタグのリストを取得できます。

FT.AGGREGATE product_tags * 
   GROUP BY 1 @TAG 
     REDUCE SUM 1 @score as total_score
   SORT BY 2 @total_score DESC

これにより、上位のタグが順番に表示されますが、タグごとに上位 5 つの製品を取得したい場合、REDUCE TOLIST 1 @product_name並べ替えられていないすべての製品REDUCE FIRST_VALUE 4 @product_name BY @score DESCを返すものと、最初の上位の製品のみを返すものしかないことがわかりました。

1 つのクエリでタグごとに上位 5 つの製品を取得する方法はありますか。そうでない場合、この種のクエリを可能にする方法で、またはできるだけ少ないクエリでドキュメントの保存形式を変更する (または追加する) ことは可能ですか?

問題ではありませんが、私は python Redisearch クライアントを使用しています。

4

1 に答える 1