[英]Term Vector Frequency in Lucene 4.0
我正在从Lucene 3.6升级到Lucene 4.0-beta。 在Lucene 3.x中, IndexReader
包含一个方法IndexReader.getTermFreqVectors()
,我可以使用它来提取给定文档和字段中每个术语的频率。
此方法现在由IndexReader.getTermVectors()
替换,它返回Terms
。 我如何利用这个(或可能是其他方法)来提取文档和字段中的术语频率?
也许这会对你有所帮助:
// get terms vectors for one document and one field
Terms terms = reader.getTermVector(docID, "fieldName");
if (terms != null && terms.size() > 0) {
// access the terms for this field
TermsEnum termsEnum = terms.iterator(null);
BytesRef term = null;
// explore the terms for this field
while ((term = termsEnum.next()) != null) {
// enumerate through documents, in this case only one
DocsEnum docsEnum = termsEnum.docs(null, null);
int docIdEnum;
while ((docIdEnum = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
// get the term frequency in the document
System.out.println(term.utf8ToString()+ " " + docIdEnum + " " + docsEnum.freq());
}
}
}
具体而言,请参阅此相关问题
Terms vector = reader.getTermVector(docId, CONTENT);
TermsEnum termsEnum = null;
termsEnum = vector.iterator(termsEnum);
Map<String, Integer> frequencies = new HashMap<>();
BytesRef text = null;
while ((text = termsEnum.next()) != null) {
String term = text.utf8ToString();
int freq = (int) termsEnum.totalTermFreq();
frequencies.put(term, freq);
terms.add(term);
}
有关如何使用灵活索引apis的各种文档:
访问文档术语向量的字段/术语与用于访问帖子列表的API完全相同,因为术语向量实际上只是一个文档的微型反向索引。
因此,完全可以使用所有这些示例,尽管您可以制作一些快捷方式,因为您知道在这个“微型倒排索引”中只有一个文档。 例如,如果你只是想获得一个术语的频率,你可以寻求它并使用像totalTermFreq这样的聚合统计数据(参见https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core /org/apache/lucene/index/package-summary.html#stats ),而不是实际打开只会枚举单个文档的DocsEnum。
我有这个工作在我的Lucene 4.2索引。 这是一个适合我的小测试程序。
try {
directory[0] = new SimpleFSDirectory(new File(test1));
directory[1] = new SimpleFSDirectory(new File(test2));
directory[2] = new SimpleFSDirectory(new File(test3));
directoryReader[0] = DirectoryReader.open(directory[0]);
directoryReader[1] = DirectoryReader.open(directory[1]);
directoryReader[2] = DirectoryReader.open(directory[2]);
if (!directoryReader[2].isCurrent()) {
directoryReader[2] = DirectoryReader.openIfChanged(directoryReader[2]);
}
MultiReader mr = new MultiReader(directoryReader);
TermStats[] stats=null;
try {
stats = HighFreqTerms.getHighFreqTerms(mr, 100, "My Term");
} catch (Exception e1) {
e1.printStackTrace();
return;
}
for (TermStats termstat : stats) {
System.out.println("IBI_body: " + termstat.termtext.utf8ToString() +
", docFrequency: " + termstat.docFreq);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.