2012-02-14 3 views
1

У меня есть индекс, где мне нужно получить все документы со стандартным поиском, по-прежнему оцениваемые по релевантности, даже если документ не является хитом.испускать каждый документ в базе данных с помощью lucene

Моя первая идея - добавить поле, которое всегда соответствует, но это может исказить оценку релевантности.

+0

Вы могли бы уточнить, нужны ли вам все документы, заказанные в какой-то мере? Если это так, вы можете открыть индекс с помощью IndexReader и выполнить цикл сбора документов. – Mikos

+0

В Solr вы можете использовать запрос «*: *» для извлечения всех документов и всех полей из индекса. – Mikos

ответ

2

Используйте BooleanQuery, чтобы комбинировать исходный запрос с MatchAllDocsQuery. Вы можете смягчить эффект, который это имеет при подсчете, установив повышение на MatchAllDocsQuery до нуля, прежде чем объединить его с основным запросом. Таким образом, вам не нужно добавлять в индекс другое фиктивное поле.

Например:

// Parse a query by the user. 
QueryParser qp = new QueryParser(Version.LUCENE_35, "text", new StandardAnalyzer()); 
Query standardQuery = qp.parse("User query may go here"); 

// Make a query that matches everything, but has no boost. 
MatchAllDocsQuery matchAllDocsQuery = new MatchAllDocsQuery(); 
matchAllDocsQuery.setBoost(0f); 

// Combine the queries. 
BooleanQuery boolQuery = new BooleanQuery(); 
boolQuery.add(standardQuery, BooleanClause.Occur.SHOULD); 
boolQuery.add(matchAllDocsQuery, BooleanClause.Occur.SHOULD); 

// Now just pass it to the searcher. 

Это должно дать вам хиты standardQuery следуют остальные документы в индексе.

Смежные вопросы