Фильтрация количества слов в Lucene (Java) - PullRequest
0 голосов
/ 22 февраля 2012

В настоящее время я пытаюсь получить количество появлений каждого слова в поле описания, используя Lucene. F.E.

  • описание: КОРОБКА ЯБЛОКОВ
  • описание: КОРОБКА БАНАНОВ

выход:

  • BOX 2
  • OF 2
  • ЯБЛОКИ 1
  • BANANAS 1

Я ищу слово и частоту.

Дело в том, что я хотел бы отфильтровать эти результаты для данного документа, я имею в виду только подсчет слов в поле описания данного документа.

Спасибо за любую помощь.

// в ответ на комментарий: У меня есть что-то вроде этого:

public ArrayList<ObjectA> GetIndexTerms(String code) {
        try {

            ArrayList<Object> termlist = new ArrayList<ObjectA>();
            indexR = IndexReader.open(path); 
            TermEnum terms = indexR.terms();           

            while (terms.next()) {
                Term term = terms.term();
                String termText = term.text();                    
                int frequency = indexR.docFreq(term); 
                ObjectA newObj = new ObjectA(termText, frequency);
                termlist.add(newObj);                      
                }                   
            }               
            return termlist;
        } catch (Exception ex) {               
            ex.printStackTrace();
            return null;
        }
}

Но я не вижу, как отфильтровать его по документу ...


// СЕГОДНЯ!

Используя termfreqvec, я могу заставить его работать, но он требует de doc id, и я не могу использовать его правильно. Поскольку я использовал запрос, значение de "i" начинается с 0, а это не правильный идентификатор документа. Любые идеи, чтобы заставить это работать должным образом? Спасибо!

    TopDocs tp = indexS.search(query, Integer.MAX_VALUE);
        for (int i = 0; i < tp.scoreDocs.length; i++){  
            ScoreDoc sds = tp.scoreDocs[i];
            Document doc = indexS.doc(sds.doc);
            TermFreqVector tfv = indexR.getTermFreqVector(i,"description");

            for (int j = 0; j < tfv.getTerms().length; j++) {
                String item = tfv.getTerms()[j];
                termlist.add(new TerminoDescripcion(item.toUpperCase(), tfv.getTermFrequencies()[j]));
            }
        }

1 Ответ

2 голосов
/ 22 февраля 2012

Проблема в том, что Lucene является инвертированным индексом, что означает, что он позволяет легко извлекать документы на основе терминов, тогда как вы ищете противоположное, то есть извлекаете термины на основе документов.

Надеемся, что это повторяющаяся проблема, и Lucene дает вам возможность извлекать термины для документа ( векторы терминов ) при условии, что вы включили эту функцию во время индексации.

См. TermVector.YES и Конструктор поля , чтобы узнать, как включить их во время индексации, и IndexReader , чтобы узнать, как извлечь векторы терминов во время поиска.

Кроме того, вы можете повторно проанализировать сохраненное поле на лету, но это может быть медленнее, особенно на больших полях.

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