0

ドキュメントがすでにインデックスに登録されているので、検索時にそのドキュメントを2つに分割する必要があります。最初の部分は最初の100ワード(トークン)で構成され、残りのドキュメントは2番目の部分を表します。この2つの部分を次のようにスコアリングする必要があります。2番目の部分は70%で、最初の部分は30%です。

編集2: SpanPositionRangeQueryを使用するサーチャーを作成しようとしましたが、ヒットを取得できないため、SpanQueryの使用法をすべて間違って理解している必要があります(検索している単語がインデックスに登録されているかどうかを確認するためにlukeallを使用しました)。誰かが私に手を差し伸べてもらえますか?

public static void search(String indexDir, String q) throws Exception
{

    Directory dir = FSDirectory.open(new File(indexDir), null);
    IndexSearcher is = new IndexSearcher(dir);

    Term term = new Term("Field", q);
    SpanPositionRangeQuery spanQuery = new SpanPositionRangeQuery(new SpanTermQuery(term), 0, 100);
    spanQuery.setBoost(0.3f);CustomRomanianAnalyzer(Version.LUCENE_35));

    long start = System.currentTimeMillis();
    TopDocs hits = is.search(spanQuery, 10);
    //TopDocs hits = is.search(query, 10);
    long end = System.currentTimeMillis();

    System.err.println("I found " + hits.totalHits + " documents (in " +
            (end - start) + " milliseconds) '" +
            q + "':");

    for (int i=0;i<hits.scoreDocs.length;i++)
    {
        ScoreDoc scoreDoc = hits.scoreDocs[i];
        Document doc = is.doc(scoreDoc.doc);
        System.out.println(doc.get("filename"));
    }

    is.close();
}

クエリパーサーをSpanPositionRangeQueryと組み合わせて、必要なものを取得する方法がわかりません...

4

1 に答える 1

1

はい、これは BooleanQuery の各句にブーストを設定することで実行できます。個別のフィールドを使用しても機能しますが、厳密には必要ではありません。Lucene には、ドキュメントの一部を検索するのに適したSpanPositionRangeQueryがあります。

<SpanPositionRangeQuery: spanPosRange(field:term, 0, 100)^0.3>
于 2012-05-15T21:37:46.517 に答える