簡體   English   中英

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 中的術語頻率?)。 根據文檔,有一種方法可以做到這一點:

public final Terms getTermVector(int docID, String field) throws 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);

我有五個問題:

  1. Lucene 如何識別id字段用作此文檔的docId 甚至 Lucene 有沒有?
  2. 我使用String作為 id 但這個方法給出了一個int 它會導致問題嗎?
  3. 有沒有合適的方法來獲取帖子?
  4. 我用過TextField 有沒有辦法檢索該字段的術語向量( Terms )? 我不想按照此處的說明重新索引我的文檔,因為它太大(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 object 都有與文檔字段相關的術語和頻率,您可以通過以下代碼檢索它們:

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 字段默認禁用此選項。 所以你需要設置它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM