Luceneには常に一定のスコアが付いていたので、私はブースト値を無視していました。Lucene - 句数に対するスコアリング効果
パーサーのrewriteMethodをSCORING_BOOLEAN_QUERY_REWRITEに設定すると、そのトリックが実行されましたが、私が得意でない 'clauseCount'には奇妙な副作用があります。
私は一定のスコアリングで、maxClauseCountにはデフォルトで1024の問題はありません。動的スコアリングでは、clauseCountは1024をすばやく超えました。なぜそれが本当にかと思います。
誰もがこの技術的な詳細を知っていますか?
「ca *」のようなクエリは「car OR cars」に書き換えられているとの別の記事があります。しかし、常に一定のスコアリングや動的スコアリングを使用していても、常にそうであるべきではないでしょうか?
ありがとうございます!
編集: だから私の解決策です。私はいくつかの問題に遭遇しました。なぜなら、ドキュメントを作成したときに設定した値を上げるドキュメントは、後でドキュメントを取得したときに常に1.0でした。バグかもしれないが、私はこれについては分からない。私が知っているのは、検索者からドキュメントを取得すると、ドキュメントオブジェクトが新しく作成され、ブースト値が設定されないということです。ちょうどフィールド。 C#ポートに関連する可能性があります。 とにかく、元のクエリを使用し、ドキュメントフィールドに設定した最初のブースト値とスコアを掛け合わせたCustomScoreQueryを書きました(厄介な回避策です)。
十分な話があります。私は改善の余地があります。特に私は検索者やフィールドの必要なしに元のブースト値を得ることができました。
public class DynamicBoostingQuery : CustomScoreQuery
{
private Searcher s;
public DynamicBoostingQuery(Query q, Searcher searcher)
: base(q)
{
this.s = searcher;
}
public override float CustomScore(int doc, float subQueryScore, float valSrcScore)
{
float val = base.CustomScore(doc, subQueryScore, valSrcScore);
try
{
Document d = s.Doc(doc);
float priority = float.Parse(d.Get("raw_categoryPriority"));
return val * priority;
}
catch
{
return val;
}
}
}
[doc on getBoost](http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/document/Document.html#getBoost())(をご覧ください。 Luceneの優れたアイディアです。ドキュメントブーストは検索時に利用できるものではなく、個々のフィールドの効果的なブーストに掛けられます。多分それはあなたに開かれた道です - Fieldable.getBoostを使用してください。 –
しました。 "検索時に、検索されたドキュメントの場合、このメソッドは常に1を返します。"残念ながら、私の解決策は変わりません。ああ、それほど悪くはない。 :) – Enzi