Мы используем 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 случай.