1

SOLR を使用してデータ分析を行っていますが、大きな価値をもたらす可能性のある 1 つの部分に行き詰まっています。

範囲である多数の数値フィールドを持つ solr コレクションがあります。次に例を示します。

pr_high_max = 10.35
pr_high_min = 8.15

pr_med_max = 12.55
pr_med_min = 10.40

各最小/最大の組み合わせは価格帯を提供し、高/中の部分はその範囲で現在のグループ内のアイテムの数によって導き出されます。いくつかのファンキーな数学については触れません.

商品価格を使用して solr にクエリを実行し、その価格が範囲の 1 つであるドキュメントを取得する必要があります。高いフィールドが med フィールドよりも優先されるように、それに重みを割り当てることができる必要があります。これは基本的に逆 RANGE 検索です。

私が照会している他のフィールドがあるため、これは重み付けに含める必要があります。これも fq にはできません。アイテムがこの基準に一致しない場合、一致する可能性のある他のフィールドがあるためです。

これまでのところ、この関数クエリを組み立てることができました。

 prboost:sum(
 if(and(query({!edismax v='pr_high_max:[8 TO *]' }),query({!edismax v='pr_high_min:[* TO 8]'})),5,0),
 if(and(query({!edismax v='pr_med_max:[8 TO *]' }),query({!edismax v='pr_med_min:[* TO 8]'})),3,0),
 if(and(query({!edismax v='pr_low_max:[8 TO *]' }),query({!edismax v='pr_low_min:[* TO 8]'})),1,0),
 )

8 は渡す価格です。基本的に、これは価格が範囲内にあるかどうかを確認し、範囲内にある場合は値を返します。高値は 5、中値は 3、安値は 1 です。 . 理想的には、これを通常の重み付けに含めたいのですが、これをサブクエリとして追加できませんでした。さらに、それをブーストしようとすると、「Infinite Recursion detected parsing query 'pr_high_max:[8 TO *]'」が返されます

誰かが前にこのようなことに遭遇したことがありますか? 何か案は?

また、進行中のデータを制御できるので、解決が容易になる場合は、データを簡単にマッサージして別の方法で範囲を表すことができます。

前もって感謝します

4

1 に答える 1

1

わかりました、しばらく時間がかかりましたが、理解しました。空のブーストパラメーターを各クエリに追加する必要がありました。これが機能します。1 から始めて、すべての値を合計しています (これがないと、追加のブーストによって値が 1 未満になり、実際にドキュメントにペナルティが課せられるため)。各サブクエリが実行され、一致するサブクエリに応じて、ブーストが 1、5、10、または 15 パーセント増加します。

sum(1, if(and(query({!edismax boost='' v='pr_shigh_max:[$doc->{pr} TO *]' }),query({!edismax boost=''       v='pr_shigh_min:[* TO $doc->{pr}]'})),0.15,0), 
if(and(query({!edismax boost='' v='pr_high_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_high_min:[* TO $doc->{pr}]'})),0.1,0), 
if(and(query({!edismax boost='' v='pr_med_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_med_min:[* TO $doc->{pr}]'})),0.05,0), 
if(and(query({!edismax boost='' v='pr_low_max:[$doc->{pr} TO *]' }),query({!edismax boost='' v='pr_low_min:[* TO $doc->{pr}]'})),0.01,0))
于 2014-05-05T15:23:10.153 に答える