SpanPositionRangeQuery

SpanPositionRangeQuery

拥有已被索引的文档时,在搜索时我必须将该文档分为两部分:第一部分由前100个单词(令牌)组成,而文档的其余部分则代表第二部分。我必须为这两个部分打分:第二部分占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结合起来以获取我所需要的...

最佳答案

是的,这可以通过为BooleanQuery中的每个子句设置boost来完成。使用单独的字段将起作用,但并非绝对必要。 Lucene具有SpanPositionRangeQuery适用于搜索文档的一部分。

<SpanPositionRangeQuery: spanPosRange(field:term, 0, 100)^0.3>

09-28 05:03