3

Lucene.NET APIに少し混乱していますが、まだ学習中であるため、誤解されている可能性があります。

ドキュメントを作成するときは、そのドキュメントにフィールドを追加します。例:

//Create the field.
field = new Field(
    fieldName,
    fieldValue,
    isFieldStorable ? Field.Store.YES : Field.Store.NO,
    Field.Index.ANALYZED
);

//If a boost value was supplied, then set the boost for this field.
if (boostValue != null) {
    field.SetBoost((float)boostValue);
}

これにより、フィールドのブーストが正しく設定されます。次に、フィールドがドキュメントに追加され、ドキュメントがインデックスライターに追加されます。

しかし、フィールドにブーストを設定することは本当に重要ではないようです。それはどのように違いを生むのでしょうか?なぜなら、クエリを作成するときに、次のようなものを呼び出す必要があるからです。

multiFieldQueryParser = new MultiFieldQueryParser(
    Lucene.Net.Util.Version.LUCENE_29,
    fieldsToSearch.ToArray(),
    analyzer
);

MultiFieldQueryParserのインスタンスを作成すると、ブーストの辞書を提供できますが、フィールドにブーストを設定する意味は何ですか?クエリパーサーは、私のドキュメントとその中に含まれるフィールドについて何も知りません(その結果、私のフィールドブーストについては何も知りません)。

これはおそらく古いコードがライブラリに残っているという単なる間違いですか?または、コードの構造が異なる場合、フィールドにブーストを設定することで実際に違いが生じる可能性がありますか?

4

2 に答える 2

2

Luceneでは、インデックス作成時間のブースト(ドキュメントおよびフィールドレベルで)とクエリ時間のブーストが可能です。

ドキュメントを作成し、フィールドレベルでブーストを追加すると、インデックス作成時間のブーストが使用されます。

MultiFieldQUeryParserのブースト引数は、クエリ時間をブーストするためのものです。インデックスタイムブースト値を使用する場合は、このブースト値を渡す必要はありません。そのブースト値は、スコア計算で暗黙的に使用されます。

于 2012-06-20T17:08:38.980 に答える
2

私はEk0nomikと同じロジックを使用し、拡張されたクエリに対して一定のスコアを取得します。

SetMultiTermRewriteMethod(CORING_BOOLEAN_QUERY_REWRITE)MultiFieldParserでを使用し、インデックスで2つのフィールドを検索します。最初のフィールドにはboost-value=2があり、2番目のフィールドにはdefault-value=1があります。
ドキュメントにインデックスを付けた後、インデックスに正しいノルム値が表示されます(lukeを使用)。異なるフィールドの検索語でインデックスを検索している間、すべての結果に対して同じ関連性が得られます。
ブースト値が2のフィールドには、より高い関連性があるはずだと思います。正しいスコアリング結果を考えるのに間違いがありますか?

デバッグモードでは、検索語を解析した後、結果をスコアリングするための構文が表示されません。次のようになります...description:*test* title:*test* path:*test*...。検索クエリの
ようなスコア値はありませんか?...description:*test* title:*test*^2 path:*test*...

于 2012-10-05T17:09:54.680 に答える