2

私がSOLRに送信する検索クエリは次のとおりです。

?q=iphone 4s&sort=sold desc

デフォルトでは検索はうまく機能しますが、たとえば、あるフィールドで結果を並べ替えたい場合に問題が発生します。販売済み-販売された製品の数。

SOLRは、(iphone 4s)または(iphone)または(4s)のすべての結果を検索します。したがって、フィールドで並べ替えを適用すると、「販売済み」の最初の結果は「iPhone3GS...」になります。これは問題です。

最初にフレーズ( "iphone 4s")で結果を表示し、次に残りの結果を必要とします。すべて販売順に並べ替えられます。

したがって、質問は次のとおりです。

このようなクエリを実行することは可能ですか?

q=iphone 4s&sort={some algoritam for phrase results first} desc, sold desc

または、クエリアナライザーを設定してこれを実行できますか?

現時点では、これはSOLRに2つのリクエストを送信することで解決されます。最初は「iphone4s」というフレーズで、これが0の結果を返す場合は、フレーズなしで2番目のリクエストを実行します-iphone4sのみ。

4

2 に答える 2

0

スコア、ID、フィールドによるソートでは不十分な場合、Lucene では、FieldComparatorSource 抽象基本クラスの独自のサブクラスを提供することにより、カスタムのソート メカニズムを実装できます。

その custom-sort-logic を使用して、要件を実現する方法を実装できます。

Java コードの例:

If(modelNum1.equals(modelNum2)){
//return based on number of units sold.
}else{
//ALWAYS return a value such that the preferred model beats others.
}

免責事項: これにより、新しい電話モデルが到着したときにロジックを変更する必要があるため、メンテナンスの問題が発生する可能性があります。

手順:

1) ソート オブジェクトは、インスタンス化中に FieldComparatorSource タイプのインスタンスを受け入れます。

2) FieldComparatorSource を拡張する

3) setNextReader() の FieldComparatorSource 内で FieldCache を使用して、「SORTING」に参加する必要なフィールド情報をロードする必要があります。

4) FieldComparatorSource.newComparator() をオーバーライドして、カスタム FieldComparator を返します。

5) メソッド FieldComparator.compare(slot1DocId, slot2DocId) では、渡された docIds を使用して、読み込まれた FieldCache を介して対応するフィールド情報にアクセスすることにより、カスタム ロジックを含めることができます。

Lucene コードをプラグインとして Solr に組み込むことは問題ありません。

于 2013-03-17T01:12:13.250 に答える
0

編集:

その機能ではスペースを使用できません。用語はスペースなしでのみです。


Solr3.1 では、ドキュメントごとに 1 つの値を生成する任意の関数クエリ ( FunctionQueryなど)で並べ替えを実行することもできます。

したがって、関数termfreqをソートで使用します

termfreq(field,term) は、用語がそのドキュメントのフィールドに出現する回数を返します。

検索クエリは

q=iphone 4s&sort=termfreq(product_name,"iphone 4s") desc, sold desc

注:関数 termfreq は、Solr 4.0 バージョンからアクティブになります。

于 2013-03-17T10:08:23.947 に答える