Для расчета частоты использования термина можно использовать IndexReader.getTermVector(int docID ,String field)
. int docID
- это поле, которое ссылается на идентификатор документа, созданный Lucene. Вы можете получить 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 по умолчанию отключили эту опцию. Значит вам нужно его установить.