这是代码:
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,但是我不知道如何更改。
这是错误:
线程“主”中的异常java.lang.Error:未解决的编译问题:
at BM25.main(BM25.java:269)
最佳答案
在Apache Lucene Migration Guide中,
现在,术语本质上是二进制的(任意的byte []),由BytesRef类表示(将偏移量+长度“ slice”提供给现有的byte [])。
从每个字段(TermEnum)中的术语分别枚举(Fields.iterator())字段。
TermDocs重命名为DocsEnum。
TermPositions重命名为DocsAndPositionsEnum,并且不再扩展仅文档枚举器(DocsEnum)。
删除的文档不再从docs / positions枚举中隐式过滤。相反,您在获取枚举时传递了Bits skipDocs(跳过了设置的位)。此外,您现在可以向读者询问其删除的文档。
docs / positions枚举无法查找术语。相反,TermsEnum可以查找,然后您从该TermsEnum请求文档/位置枚举。
TermsEnum的seek方法返回更多信息。
TermsEnum有一个ord()方法,返回未定位的术语的长数字序数(即,第一个为0,下一个为1,依此类推)。还有一种对应的seek(long ord)方法。注意,这些方法是可选的。特别是MultiFields TermsEnum没有实现它们。
您获取枚举的方式已更改。主要入口点是Fields类。 DocsAndPositionsEnum也是如此。
关于java - 如何将lucene36转移到lucene 40,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22615627/