过滤术语计数Lucene(Java)

时间:2012-02-22 12:49:34

标签: java lucene

我目前正在尝试使用Lucene获取描述字段中每个单词的出现量。 F.E.

  • description:BOX OF APPLES
  • 描述:BOAN OF BANANAS

输出:

  • BOX 2
  • OF 2
  • APPLES 1
  • BANANAS 1

我希望得到这个词和频率。

问题是我想将这些结果过滤到给定的文档,我的意思是只计算给定文档的描述字段中的单词。

感谢您给予的任何帮助。

//回答评论: 我有这样的事情:

public ArrayList<ObjectA> GetIndexTerms(String code) {
        try {

            ArrayList<Object> termlist = new ArrayList<ObjectA>();
            indexR = IndexReader.open(path); 
            TermEnum terms = indexR.terms();           

            while (terms.next()) {
                Term term = terms.term();
                String termText = term.text();                    
                int frequency = indexR.docFreq(term); 
                ObjectA newObj = new ObjectA(termText, frequency);
                termlist.add(newObj);                      
                }                   
            }               
            return termlist;
        } catch (Exception ex) {               
            ex.printStackTrace();
            return null;
        }
}

但我不知道如何通过文件来过滤它......


// TODAY!

使用termfreqvec我可以让它工作,但需要de doc id,我无法正确使用它。由于我使用了查询de“i”值从0开始,这不是正确的文档ID。有什么想法让这个工作正常吗?  谢谢!

    TopDocs tp = indexS.search(query, Integer.MAX_VALUE);
        for (int i = 0; i < tp.scoreDocs.length; i++){  
            ScoreDoc sds = tp.scoreDocs[i];
            Document doc = indexS.doc(sds.doc);
            TermFreqVector tfv = indexR.getTermFreqVector(i,"description");

            for (int j = 0; j < tfv.getTerms().length; j++) {
                String item = tfv.getTerms()[j];
                termlist.add(new TerminoDescripcion(item.toUpperCase(), tfv.getTermFrequencies()[j]));
            }
        }

1 个答案:

答案 0 :(得分:2)

问题在于Lucene是一个倒置索引,这意味着它可以很容易地根据术语检索文档,而您正在寻找相反的方法,即根据文档检索术语。

希望这是一个经常出现的问题,Lucene让您能够检索文档的术语(术语向量),前提是您在索引时启用了此功能。

请参阅TermVector.YESField constructor了解如何在索引编制时启用它们,IndexReader了解如何在搜索时检索术语向量。

或者,您可以动态地重新分析存储的字段,但这可能会更慢,尤其是在大字段上。