繁体   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