Lucene 8.5.1 中 IndexReader.getTermVector(int docID ,String field) 中的 docID 是什么,它是如何工作的?

What is docID in IndexReader.getTermVector(int docID ,String field) in Lucene 8.5.1 and how does it work?

我正在尝试从 Lucene 的文档字段中获取调用 Terms 的所有术语和相关帖子(即如何计算 Lucene 中的术语频率?)。根据 documentation 有一种方法可以做到这一点:

public final Terms getTermVector​(int docID, String field) throws IOException

Retrieve term vector for this document and field, or null if term vectors were not indexed. The returned Fields instance acts like a single-document inverted index (the docID will be 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);

我有五个问题:

  1. Lucene 如何识别 id 字段用作此文档的 docId?甚至 Lucene 会不会做 ??
  2. 我使用 String 作为 id,但此方法给出了 int。它会导致问题吗?
  3. 有什么合适的获取贴子的方法吗?
  4. 我用过TextField。有没有办法检索该字段的术语向量(Terms)?我不想按照 here 的说明重新索引我的文档,因为它太大 (35-GB)。
  5. 有没有什么方法可以从 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();
}

注意:在索引文档时,不要忘记设置存储词向量,正如我所解释的here (Or this one)。如果您在没有设置存储术语向量的情况下为您的文档建立索引,方法 getTermVector 将 return null。默认情况下,所有类型的预定义 Lucene 字段都会停用此选项。所以你需要设置它。