在Lucene 8.5.1中,什么是indexReader.getTermVector(int docID,String字段)中的docID?它是如何工作的?

dxpyg8gm  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(246)

我试图从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是否识别?
    1.我使用String作为id,但是这个方法给予了一个int。这会导致问题吗?
    1.是否有任何适当的方法来获取帖子?
    1.我已经使用了TextField。有没有办法检索该字段的术语向量(Terms)?我不想像here解释的那样重新索引我的文档,因为它太大了(35-GB)。
    1.有没有办法从TextField中获得术语计数和每个术语的频率?
luaexgnf

luaexgnf1#

要计算词频,我们可以使用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对象都有与文档字段相关的term和frequency,您可以通过以下代码检索它们:

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();
}

注意:当你索引文档时,不要忘记设置存储词条向量,如我在这里解释的(或者this one)。如果你索引你的文档而没有设置存储词条向量,方法getTermVector将返回null。所有类型的预定义Lucene字段默认情况下都停用了这个选项。所以你需要设置它。

相关问题