Как получить идентификаторы документов для вектора термина документа в Lucene - PullRequest
0 голосов
/ 20 января 2012

Я новичок в мире Lucene и не очень хорошо разбираюсь в предмете. Мне нужно извлечь вектор термина документа, и я нашел следующий код онлайн Как извлечь вектор термина документа в Lucene 3.5.0 .

 /**
 * Sums the term frequency vector of each document into a single term frequency map
 * @param indexReader the index reader, the document numbers are specific to this reader
 * @param docNumbers document numbers to retrieve frequency vectors from
 * @param fieldNames field names to retrieve frequency vectors from
 * @param stopWords terms to ignore
 * @return a map of each term to its frequency
 * @throws IOException
 */
private Map<String,Integer> getTermFrequencyMap(IndexReader indexReader, List<Integer> docNumbers, String[] fieldNames, Set<String> stopWords)
throws IOException {
    Map<String,Integer> totalTfv = new HashMap<String,Integer>(1024);

    for (Integer docNum : docNumbers) {
        for (String fieldName : fieldNames) {
            TermFreqVector tfv = indexReader.getTermFreqVector(docNum, fieldName);
            if (tfv == null) {
                // ignore empty fields
                continue;
            }

            String terms[] = tfv.getTerms();
            int termCount = terms.length;
            int freqs[] = tfv.getTermFrequencies();

            for (int t=0; t < termCount; t++) {
                String term = terms[t];
                int freq = freqs[t];

                // filter out single-letter words and stop words
                if (StringUtils.length(term) < 2 ||
                    stopWords.contains(term)) {
                    continue; // stop
                }

                Integer totalFreq = totalTfv.get(term);
                totalFreq = (totalFreq == null) ? freq : freq + totalFreq;
                totalTfv.put(term, totalFreq);
            }
        }
    }

    return totalTfv;
}

Я создал индекс, который находится в следующем каталоге.

String indexDir = "C:\\Lucene\\Output\\";
Directory dir = FSDirectory.open(new File(indexDir));
IndexReader reader = IndexReader.open(dir);

Моя проблема в том, что я не знаю, как получить идентификаторы документов (List docNumbers), которые требуются для вышеупомянутой функции. Я пробовал несколько методов, таких как

TermDocs docs = reader.termDocs();

но это не сработало.

1 Ответ

2 голосов
/ 21 января 2012

Lucene начинает присваивать идентификаторы с нуля, а maxDoc () - это верхний предел, поэтому вы можете просто зацикливаться, чтобы получить все идентификаторы, пропуская удаленные документы (Lucene помечает их для удаления при вызове deleteDocument):

for (int docNum=0; docNum < reader.maxDoc(); docNum++) {
    if (reader.isDeleted(docNum)) {
        continue;
    }
    TermFreqVector tfv = reader.getTermFreqVector(docNum, "fieldName");
    ...
}

Чтобы это работало, вы должны включить их во время индексации, см. Field.TermVector .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...