这是代码:
public int docsContainTerm(Term tm) throws IOException {
TermDocs termDocs = indexReader.termDocs(tm);
//DocsEnum termDocs = indexReader.
int count = 0;
while (termDocs.next()) {
if (indexReader.docFreq(tm) != 0) {
count++;
}
}
return count;
}
public int tf(Term tm, String docName) throws IOException {
TermDocs termDocs = indexReader.termDocs(tm);
while (termDocs.next()) {
Document doc = indexReader.document(termDocs.doc());
if (doc.get("filename").equals(docName)) {
return termDocs.freq();
}
}
return 0;
}
public static void main(String[] args) throws CorruptIndexException, IOException {
String indexDir = "indexDir";
String docs = "docs";
String query = "KENNEDY ADMINISTRATION PRESSURE ON NGO DINH DIEM TO STOP SUPPRESSING THE BUDDHISTS";
Directory dir = FSDirectory.open(new File(indexDir));
IndexReader indexReader = IndexReader.open(dir);
BM25 bm25 = new BM25(indexReader, docs);
System.out.println(bm25.getContent("171"));
System.out.println(bm25.htmlGetContent("171", query.toLowerCase()));
}
}
我搜索了一些相关内容,有人说我应该将 TermDocs 更改为 DocsEnum,但我不知道如何更改。 这是错误: 线程“main”java.lang.Error 中出现异常: Unresolved 编译问题:
at BM25.main(BM25.java:269)
最佳答案
来自Apache Lucene Migration Guide ,
术语现在本质上是二进制的(任意 byte[]),由 BytesRef 类表示(它提供了现有 byte[] 中的偏移量 + 长度“切片”)。
字段是根据每个字段中的术语 (TermEnum) 单独枚举的 (Fields.iterator())。
TermDocs 已重命名为 DocsEnum。
TermPositions 已重命名为 DocsAndPositionsEnum,并且不再扩展仅文档枚举器 (DocsEnum)。
已删除的文档不再从文档/位置枚举中隐式过滤。相反,在获取枚举时,您传递一个 BitsskipDocs(设置的位被跳过)。此外,您现在可以向读者询问其已删除的文档。
文档/位置枚举无法查找术语。相反,TermsEnum 能够进行查找,然后您可以从该TermsEnum 请求文档/职位枚举。
TermsEnum 的查找方法返回更多信息。
TermsEnum 有一个 ord() 方法,返回未定位到的术语的长数字序数(即第一项是 0,下一项是 1,依此类推)。还有相应的seek(long ord)方法。请注意,这些方法是可选的;特别是 MultiFieldsTermEnum 没有实现它们。
获取枚举的方式已更改。主要入口点是 Fields 类。 DocsAndPositionsEnum 也是如此。
关于java - 如何将lucene36转移到lucene 40,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22615627/