Найти количество вхождений для сопоставленного документа в люцене - PullRequest
0 голосов
/ 18 мая 2018

Мы используем Lucene для поиска содержимого кода.мы индексируем файлы в проекте с помощью нашего собственного Custom Analyzer.У нас возникли проблемы с получением числа вхождений для сопоставленного файла.

Мы получили точное число вхождений на файл, когда мы использовали при поиске BooleanQuery (A фразуQuery с выражением must).Теперь мы добавили еще два запроса к предыдущему, например BooleanQuery (A фразуQuery с обязательным предложением + A prefixQuery с обязательным предложением).Для этого запроса мы получаем точные результаты совпадений, но мы получаем число вхождений на файл как 2 всегда.Мы используем приведенный ниже код для получения количества вхождений

public class SearchTermFrequencyCollector implements Collector {


private IndexSearcher searcher;
private HashMap<String, Integer> result = new HashMap<String, Integer>();
public SearchTermFrequencyCollector(IndexSearcher searcher){
    this.searcher=searcher;
}

public HashMap<String, Integer> getSearchTermFrequency(){
    return result;
}
@Override
public boolean needsScores() {
  return true;
}

@Override
public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
  final int DOCID = context.docBase;
  return new LeafCollector() {
    Scorer scorer;
    @Override
    public void collect(int doc) throws IOException {
      int numOccurrencess = scorer.freq();

      LOGGER.log(Level.INFO,"DOC_ID ::: "+DOCID);

      Document document = searcher.doc(DOCID+doc);
      result.put(document.get(Constants.INDEX_FIELD_FILE_PATH), numOccurrencess);
    }

    @Override
    public void setScorer(Scorer scorer) throws IOException {
        this.scorer = scorer;

    }
  };
}

}

Мы используем указанный выше класс для получения совпавших файлов со следующим кодом.

        indexReader = getIndexReader(indexDir);
        msearcher = new IndexSearcher(indexReader);
        SearchTermFrequencyCollector searchtermfreq = new SearchTermFrequencyCollector(msearcher);
        msearcher.search(resultQuery, searchtermfreq);
        HashMap<String, Integer> resultMap = searchtermfreq.getSearchTermFrequency();
        searchDetails = new JSONObject(resultMap);
        hits = resultMap.size();
        resultDetails.put("hits", hits);
        resultDetails.put(indexType, searchDetails);

Для запроса мы используем следующий код

        searchString = searchString.toLowerCase();
        QueryParser qp = new QueryParser(IndexConstants.INDEX_FIELD_CONTENT, CodeCustomAnalyzer.getdefaultInstance());
        qp.setDefaultOperator(QueryParser.Operator.AND);
            Query contentQuery = qp.createPhraseQuery(IndexConstants.INDEX_FIELD_CONTENT, searchString);
            resultQuery.add(contentQuery, BooleanClause.Occur.MUST);
        if (fileExtn.length() > 0) {
            BooleanQuery.Builder ExtnQuery = new BooleanQuery.Builder();
            for (int i = 0; i < fileExtn.length(); i++) {
                String extn = fileExtn.getString(i);
                Query extnQuery = new TermQuery(new Term(IndexConstants.INDEX_FIELD_FILE_EXTN, extn));
                ExtnQuery.add(extnQuery, BooleanClause.Occur.SHOULD);
            }
            resultQuery.add(ExtnQuery.build(), BooleanClause.Occur.MUST);
        }
        Query filePathQuery = new PrefixQuery(new Term(IndexConstants.INDEX_FIELD_FILE_PATH, workingPaths));
        resultQuery.add(filePathQuery, BooleanClause.Occur.MUST);

Образцы документов:

Doc1:

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

При поиске

Римский генерал Я получаю Scorer.freq () в функции сбора как 2. Но есть только один случай.Если я добавляю только один запрос, например, скажем, contentquery, вместо добавления обоих ExtnQuery, filePathQuery, я получаю результат, как и ожидалось, т.е. 1 случай.

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