mirror of https://github.com/apache/lucene.git
LUCENE-6643: Make lucene/grouping Filter-free.
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1688591 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
688c67f8ff
commit
a9cc05ced1
|
@ -152,6 +152,9 @@ API Changes
|
|||
* LUCENE-6634: PKIndexSplitter now takes a Query instead of a Filter to decide
|
||||
how to split an index. (Adrien Grand)
|
||||
|
||||
* LUCENE-6643: GroupingSearch from lucene/grouping was changed to take a Query
|
||||
object to define groups instead of a Filter. (Adrien Grand)
|
||||
|
||||
Bug fixes
|
||||
|
||||
* LUCENE-6500: ParallelCompositeReader did not always call
|
||||
|
|
|
@ -23,7 +23,6 @@ import org.apache.lucene.index.IndexWriter;
|
|||
import org.apache.lucene.index.LeafReaderContext;
|
||||
import org.apache.lucene.search.DocIdSetIterator;
|
||||
import org.apache.lucene.search.FieldComparator;
|
||||
import org.apache.lucene.search.Filter;
|
||||
import org.apache.lucene.search.LeafCollector;
|
||||
import org.apache.lucene.search.LeafFieldComparator;
|
||||
import org.apache.lucene.search.Scorer;
|
||||
|
@ -34,6 +33,7 @@ import org.apache.lucene.search.TopDocs;
|
|||
import org.apache.lucene.search.TopDocsCollector;
|
||||
import org.apache.lucene.search.TopFieldCollector;
|
||||
import org.apache.lucene.search.TopScoreDocCollector;
|
||||
import org.apache.lucene.search.Weight;
|
||||
import org.apache.lucene.util.ArrayUtil;
|
||||
import org.apache.lucene.util.PriorityQueue;
|
||||
|
||||
|
@ -73,7 +73,7 @@ public class BlockGroupingCollector extends SimpleCollector {
|
|||
|
||||
private final Sort groupSort;
|
||||
private final int topNGroups;
|
||||
private final Filter lastDocPerGroup;
|
||||
private final Weight lastDocPerGroup;
|
||||
|
||||
// TODO: specialize into 2 classes, static "create" method:
|
||||
private final boolean needsScores;
|
||||
|
@ -214,10 +214,10 @@ public class BlockGroupingCollector extends SimpleCollector {
|
|||
* in the withinGroupSort or because you plan to pass true
|
||||
* for either getSscores or getMaxScores to {@link
|
||||
* #getTopGroups}
|
||||
* @param lastDocPerGroup a {@link Filter} that marks the
|
||||
* @param lastDocPerGroup a {@link Weight} that marks the
|
||||
* last document in each group.
|
||||
*/
|
||||
public BlockGroupingCollector(Sort groupSort, int topNGroups, boolean needsScores, Filter lastDocPerGroup) throws IOException {
|
||||
public BlockGroupingCollector(Sort groupSort, int topNGroups, boolean needsScores, Weight lastDocPerGroup) throws IOException {
|
||||
|
||||
if (topNGroups < 1) {
|
||||
throw new IllegalArgumentException("topNGroups must be >= 1 (got " + topNGroups + ")");
|
||||
|
@ -480,7 +480,7 @@ public class BlockGroupingCollector extends SimpleCollector {
|
|||
subDocUpto = 0;
|
||||
docBase = readerContext.docBase;
|
||||
//System.out.println("setNextReader base=" + docBase + " r=" + readerContext.reader);
|
||||
lastDocPerGroupBits = lastDocPerGroup.getDocIdSet(readerContext, readerContext.reader().getLiveDocs()).iterator();
|
||||
lastDocPerGroupBits = lastDocPerGroup.scorer(readerContext);
|
||||
groupEndDocID = -1;
|
||||
|
||||
currentReaderContext = readerContext;
|
||||
|
|
|
@ -20,12 +20,12 @@ package org.apache.lucene.search.grouping;
|
|||
import org.apache.lucene.queries.function.ValueSource;
|
||||
import org.apache.lucene.search.CachingCollector;
|
||||
import org.apache.lucene.search.Collector;
|
||||
import org.apache.lucene.search.Filter;
|
||||
import org.apache.lucene.search.IndexSearcher;
|
||||
import org.apache.lucene.search.MultiCollector;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.Sort;
|
||||
import org.apache.lucene.search.SortField;
|
||||
import org.apache.lucene.search.Weight;
|
||||
import org.apache.lucene.search.grouping.function.FunctionAllGroupHeadsCollector;
|
||||
import org.apache.lucene.search.grouping.function.FunctionAllGroupsCollector;
|
||||
import org.apache.lucene.search.grouping.function.FunctionFirstPassGroupingCollector;
|
||||
|
@ -55,7 +55,7 @@ public class GroupingSearch {
|
|||
private final String groupField;
|
||||
private final ValueSource groupFunction;
|
||||
private final Map<?, ?> valueSourceContext;
|
||||
private final Filter groupEndDocs;
|
||||
private final Query groupEndDocs;
|
||||
|
||||
private Sort groupSort = Sort.RELEVANCE;
|
||||
private Sort sortWithinGroup;
|
||||
|
@ -101,13 +101,13 @@ public class GroupingSearch {
|
|||
* Constructor for grouping documents by doc block.
|
||||
* This constructor can only be used when documents belonging in a group are indexed in one block.
|
||||
*
|
||||
* @param groupEndDocs The filter that marks the last document in all doc blocks
|
||||
* @param groupEndDocs The query that marks the last document in all doc blocks
|
||||
*/
|
||||
public GroupingSearch(Filter groupEndDocs) {
|
||||
public GroupingSearch(Query groupEndDocs) {
|
||||
this(null, null, null, groupEndDocs);
|
||||
}
|
||||
|
||||
private GroupingSearch(String groupField, ValueSource groupFunction, Map<?, ?> valueSourceContext, Filter groupEndDocs) {
|
||||
private GroupingSearch(String groupField, ValueSource groupFunction, Map<?, ?> valueSourceContext, Query groupEndDocs) {
|
||||
this.groupField = groupField;
|
||||
this.groupFunction = groupFunction;
|
||||
this.valueSourceContext = valueSourceContext;
|
||||
|
@ -233,6 +233,7 @@ public class GroupingSearch {
|
|||
|
||||
protected TopGroups<?> groupByDocBlock(IndexSearcher searcher, Query query, int groupOffset, int groupLimit) throws IOException {
|
||||
int topN = groupOffset + groupLimit;
|
||||
final Weight groupEndDocs = searcher.createNormalizedWeight(this.groupEndDocs, false);
|
||||
BlockGroupingCollector c = new BlockGroupingCollector(groupSort, topN, includeScores, groupEndDocs);
|
||||
searcher.search(query, c);
|
||||
int topNInsideGroup = groupDocsOffset + groupDocsLimit;
|
||||
|
|
|
@ -51,14 +51,11 @@ import org.apache.lucene.index.Term;
|
|||
import org.apache.lucene.queries.function.ValueSource;
|
||||
import org.apache.lucene.queries.function.valuesource.BytesRefFieldSource;
|
||||
import org.apache.lucene.search.CachingCollector;
|
||||
import org.apache.lucene.search.CachingWrapperQuery;
|
||||
import org.apache.lucene.search.Collector;
|
||||
import org.apache.lucene.search.FieldDoc;
|
||||
import org.apache.lucene.search.Filter;
|
||||
import org.apache.lucene.search.IndexSearcher;
|
||||
import org.apache.lucene.search.MultiCollector;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.QueryWrapperFilter;
|
||||
import org.apache.lucene.search.ScoreDoc;
|
||||
import org.apache.lucene.search.Sort;
|
||||
import org.apache.lucene.search.SortField;
|
||||
|
@ -798,7 +795,7 @@ public class TestGrouping extends LuceneTestCase {
|
|||
// group, so we can use single pass collector
|
||||
dirBlocks = newDirectory();
|
||||
rBlocks = getDocBlockReader(dirBlocks, groupDocs);
|
||||
final Filter lastDocInBlock = new QueryWrapperFilter(new TermQuery(new Term("groupend", "x")));
|
||||
final Query lastDocInBlock = new TermQuery(new Term("groupend", "x"));
|
||||
final NumericDocValues docIDToIDBlocks = MultiDocValues.getNumericValues(rBlocks, "id");
|
||||
assertNotNull(docIDToIDBlocks);
|
||||
|
||||
|
@ -1054,7 +1051,7 @@ public class TestGrouping extends LuceneTestCase {
|
|||
}
|
||||
|
||||
final boolean needsScores = getScores || getMaxScores || docSort == null;
|
||||
final BlockGroupingCollector c3 = new BlockGroupingCollector(groupSort, groupOffset+topNGroups, needsScores, lastDocInBlock);
|
||||
final BlockGroupingCollector c3 = new BlockGroupingCollector(groupSort, groupOffset+topNGroups, needsScores, sBlocks.createNormalizedWeight(lastDocInBlock, false));
|
||||
final TermAllGroupsCollector allGroupsCollector2;
|
||||
final Collector c4;
|
||||
if (doAllGroups) {
|
||||
|
|
Loading…
Reference in New Issue