在lucene中实现反馈

在lucene中实现反馈,lucene,Lucene,有人能给我一些提示在lucene中应用伪反馈吗。我在谷歌上找不到什么帮助。我正在使用相似类。 lucene中是否有我可以扩展以实现反馈的类? 谢谢。假设您引用的是原始查询的TopDocs,请迭代多少条(假设我们希望原始查询前25个文档的前25个术语)记录,然后调用IndexReader.getTermVectors(int),这将获取您需要的信息。迭代每一步。在将术语频率存储在散列图中时,我会立即想到这个实现 比如: //Get the original results TopDocs docs

有人能给我一些提示在lucene中应用伪反馈吗。我在谷歌上找不到什么帮助。我正在使用相似类。 lucene中是否有我可以扩展以实现反馈的类?
谢谢。

假设您引用的是原始查询的
TopDocs
,请迭代多少条(假设我们希望原始查询前25个文档的前25个术语)记录,然后调用
IndexReader.getTermVectors(int)
,这将获取您需要的信息。迭代每一步。在将术语频率存储在散列图中时,我会立即想到这个实现

比如:

//Get the original results
TopDocs docs = indexsearcher.search(query,25);
HashMap<String,ScorePair> map = new HashMap<String,ScorePair>();
for (int i = 0; i < docs.scoreDocs.length; i++) {
    //Iterate fields for each result
    FieldsEnum fields = indexreader.getTermVectors(docs.scoreDocs[i].doc).iterator();
    String fieldname;
    while (fieldname = fields.next()) {
        //For each field, iterate it's terms
        TermsEnum terms = fields.terms().iterator();
        while (terms.next()) {
            //and store it
            putTermInMap(fieldname, terms.term(), terms.docFreq(), map);
        }
    }
}

List<ScorePair> byScore = new ArrayList<ScorePair>(map.values());
Collections.sort(byScore);

BooleanQuery bq = new BooleanQuery();
//Perhaps we want to give the original query a bit of a boost
query.setBoost(5);
bq.add(query,BooleanClause.Occur.SHOULD);
for (int i = 0; i < 25; i++) {
    //Add all our found terms to the final query
    ScorePair pair = byScore.get(i);
    bq.add(new TermQuery(new Term(pair.field,pair.term)),BooleanClause.Occur.SHOULD);
}
}

//Say, we want to score based on tf/idf
void putTermInMap(String field, String term, int freq, Map<String,ScorePair> map) {
    String key = field + ":" + term;
    if (map.containsKey(key))
        map.get(key).increment();
    else
        map.put(key,new ScorePair(freq,field,term));
}

private class ScorePair implements Comparable{
    int count = 0;
    double idf;
    String field;
    String term;

    ScorePair(int docfreq, String field, String term) {
        count++;
        //Standard Lucene idf calculation.  This is calculated once per field:term
        idf = (1 + Math.log(indexreader.numDocs()/((double)docfreq + 1))) ^ 2;
        this.field = field;
        this.term = term;
    }

    void increment() { count++; }

    double score() {
        return Math.sqrt(count) * idf;
    }

    //Standard Lucene TF/IDF calculation, if I'm not mistaken about it.
    int compareTo(ScorePair pair) {
        if (this.score() < pair.score()) return -1;
        else return 1;
    }
}
//获取原始结果
TopDocs=indexsearcher.search(查询,25);
HashMap=newHashMap();
对于(int i=0;i

(在当前状态下,我不认为这是功能代码。)

您能再详细说明一下吗?你到底想要实现什么?是的,请使用我想要扩展我的查询的反馈来定义“伪反馈”。我需要一些方法来扩展我的查询(无论如何应该可以)我不知道为什么Lucene还没有支持伪相关反馈。。。如果您不想自己开发太多功能,只需使用任何其他IR工具,如Terrier或Indri……使用术语向量对于检索最频繁的术语完全有意义,但我认为我们还需要在索引时定义术语向量字段值。