我试图从Lucene的文档字段中获取所有称为条款
的术语和相关帖子(即如何计算Lucene中的术语频率?)。根据留档,有一种方法可以做到这一点:
公共最终术语getTermVector(int docID, String字段)抛出IOException
检索此文档和字段的术语向量,如果术语向量未被索引,则为null。返回的Fields实例类似于单文档倒排索引(docID将为0)。
有一个字段叫做int docID
。这是什么??对于给定的文档,它的id字段是什么,Lucene如何识别它?根据Lucene的留档,我使用了StringField
作为id,它不是int
。
import org.apache.lucene.document.*;
Document doc = new Document();
Field idField = new StringField("id",post.Id,Field.Store.YES);
Field bodyField = new TextField("body", post.Body, Field.Store.YES);
doc.add(idField);
doc.add(bodyField);
因此,我有五个问题:
id
字段用作本文档的docId
?甚至Lucene做不做??String
作为id,但此方法给出了int
。它会导致问题吗?TextField
。有什么方法可以检索该字段的术语向量(条款
)吗?我不想像这里解释的那样重新索引我的文档,因为它太大了(35-GB)。TextField
获取术语计数并获取每个术语频率?
要计算词频,我们可以使用IndexReader. getTermVector(int docID,String field)
。int docID
是一个引用Lucene创建的文档id的字段。您可以通过以下代码检索docID
:
String index = "index/AIndex/";
String query = "the query text"
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("docField", analyzer);
Query lQuery = parser.parse(query);
]TopDocs results = searcher.search(lQuery , requiredHits);
ScoreDoc[] hits = results.scoreDocs;
int numTotalHits = (int) results.totalHits.value;
for (int i = start; i < numTotalHits; i++)
{
int docID = hits[i].doc;
Terms termVector = reader.getTermVector(docID, "docField");
}
每个termVector
对象都有与文档字段相关的术语和频率,您可以通过以下代码检索它:
private HashMap<String,Long> termsFrequency = new HashMap<>();
TermsEnum itr = termVector.iterator();
int allTermFrequency=0;
BytesRef term;
while ((term = itr.next()) != null){
String termText = term.utf8ToString();
long tf = itr.totalTermFreq();
termsFrequency.put(termText, tf);
allTermFrequency += itr.totalTermFreq();
}
注意:当你索引文档时,不要忘记设置存储术语向量,就像我在这里解释的那样(或者这个)。如果你索引你的文档而没有设置存储术语向量,方法getTermVector
将返回null
。所有类型的预置Lucene Field默认情况下都禁用了这个选项。所以你需要设置它。