You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2015/05/20 11:31:26 UTC

svn commit: r1680500 - in /lucene/dev/trunk/lucene: ./ core/src/java/org/apache/lucene/search/payloads/ core/src/java/org/apache/lucene/search/spans/ core/src/test/org/apache/lucene/search/payloads/ highlighter/src/java/org/apache/lucene/search/highlight/

Author: romseygeek
Date: Wed May 20 09:31:26 2015
New Revision: 1680500

URL: http://svn.apache.org/r1680500
Log:
LUCENE-6490: SpanCollector must be created per-scorer to allow multithreaded search

Added:
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanCollectorFactory.java   (with props)
Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanCollector.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanNearPayloadCheckQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanQuery.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java
    lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java
    lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Wed May 20 09:31:26 2015
@@ -192,12 +192,12 @@ API Changes
 * LUCENE-6445: Two new methods in Highlighter's TokenSources; the existing
   methods are now marked deprecated. (David Smiley)
 
-* LUCENE-6371: Payload collection from Spans is moved to a more generic
+* LUCENE-6371, LUCENE-6490: Payload collection from Spans is moved to a more generic
   SpanCollector framework.  Spans no longer implements .hasPayload() and
   .getPayload() methods, and instead exposes a collect() method that allows
   the collection of arbitrary postings information. SpanPayloadCheckQuery and
   SpanPayloadNearCheckQuery have moved from the .spans package to the .payloads
-  package. (Alan Woodward, David Smiley, Paul Elschot)
+  package. (Alan Woodward, David Smiley, Paul Elschot, Robert Muir)
 
 * LUCENE-6484: Removed EliasFanoDocIdSet, which was unused.
   (Paul Elschot via Adrien Grand)

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadNearQuery.java Wed May 20 09:31:26 2015
@@ -56,7 +56,6 @@ public class PayloadNearQuery extends Sp
 
   protected String fieldName;
   protected PayloadFunction function;
-  protected final PayloadSpanCollector payloadCollector = new PayloadSpanCollector();
 
   public PayloadNearQuery(SpanQuery[] clauses, int slop, boolean inOrder) {
     this(clauses, slop, inOrder, new AveragePayloadFunction());
@@ -132,15 +131,16 @@ public class PayloadNearQuery extends Sp
 
     public PayloadNearSpanWeight(SpanQuery query, IndexSearcher searcher)
         throws IOException {
-      super(query, searcher, payloadCollector);
+      super(query, searcher, PayloadSpanCollector.FACTORY);
     }
 
     @Override
     public Scorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
-      Spans spans = query.getSpans(context, acceptDocs, termContexts, payloadCollector);
+      PayloadSpanCollector collector = PayloadSpanCollector.FACTORY.newCollector();
+      Spans spans = query.getSpans(context, acceptDocs, termContexts, collector);
       return (spans == null)
               ? null
-              : new PayloadNearSpanScorer(spans, this, similarity.simScorer(stats, context));
+              : new PayloadNearSpanScorer(spans, this, collector, similarity.simScorer(stats, context));
     }
     
     @Override
@@ -176,10 +176,13 @@ public class PayloadNearQuery extends Sp
     Spans spans;
     protected float payloadScore;
     private int payloadsSeen;
+    private final PayloadSpanCollector collector;
 
-    protected PayloadNearSpanScorer(Spans spans, SpanWeight weight, Similarity.SimScorer docScorer) throws IOException {
+    protected PayloadNearSpanScorer(Spans spans, SpanWeight weight, PayloadSpanCollector collector,
+                                    Similarity.SimScorer docScorer) throws IOException {
       super(spans, weight, docScorer);
       this.spans = spans;
+      this.collector = collector;
     }
 
     // TODO change the whole spans api to use bytesRef, or nuke spans
@@ -218,9 +221,9 @@ public class PayloadNearQuery extends Sp
       do {
         int matchLength = spans.endPosition() - startPos;
         freq += docScorer.computeSlopFactor(matchLength);
-        payloadCollector.reset();
-        spans.collect(payloadCollector);
-        processPayloads(payloadCollector.getPayloads(), startPos, spans.endPosition());
+        collector.reset();
+        spans.collect(collector);
+        processPayloads(collector.getPayloads(), startPos, spans.endPosition());
         startPos = spans.nextStartPosition();
       } while (startPos != Spans.NO_MORE_POSITIONS);
     }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanCollector.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanCollector.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadSpanCollector.java Wed May 20 09:31:26 2015
@@ -21,6 +21,7 @@ import org.apache.lucene.index.PostingsE
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.spans.BufferedSpanCollector;
 import org.apache.lucene.search.spans.SpanCollector;
+import org.apache.lucene.search.spans.SpanCollectorFactory;
 import org.apache.lucene.search.spans.Spans;
 import org.apache.lucene.util.BytesRef;
 
@@ -33,6 +34,13 @@ import java.util.Collection;
  */
 public class PayloadSpanCollector implements SpanCollector {
 
+  public static final SpanCollectorFactory<PayloadSpanCollector> FACTORY = new SpanCollectorFactory<PayloadSpanCollector>() {
+    @Override
+    public PayloadSpanCollector newCollector() {
+      return new PayloadSpanCollector();
+    }
+  };
+
   private final Collection<byte[]> payloads = new ArrayList<>();
   BufferedPayloadCollector bufferedCollector;
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/PayloadTermQuery.java Wed May 20 09:31:26 2015
@@ -27,6 +27,7 @@ import org.apache.lucene.search.similari
 import org.apache.lucene.search.similarities.Similarity.SimScorer;
 import org.apache.lucene.search.spans.BufferedSpanCollector;
 import org.apache.lucene.search.spans.SpanCollector;
+import org.apache.lucene.search.spans.SpanCollectorFactory;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanScorer;
 import org.apache.lucene.search.spans.SpanTermQuery;
@@ -69,10 +70,10 @@ public class PayloadTermQuery extends Sp
 
   @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
-    return new PayloadTermWeight(this, searcher, new PayloadTermCollector());
+    return new PayloadTermWeight(this, searcher);
   }
 
-  protected class PayloadTermCollector implements SpanCollector {
+  private static class PayloadTermCollector implements SpanCollector {
 
     BytesRef payload;
 
@@ -102,33 +103,32 @@ public class PayloadTermQuery extends Sp
     }
   }
 
-  protected class PayloadTermWeight extends SpanWeight {
+  private class PayloadTermWeight extends SpanWeight {
 
-    final PayloadTermCollector payloadCollector;
-
-    public PayloadTermWeight(PayloadTermQuery query, IndexSearcher searcher, PayloadTermCollector collector)
+    public PayloadTermWeight(PayloadTermQuery query, IndexSearcher searcher)
         throws IOException {
-      super(query, searcher, collector);
-      this.payloadCollector = collector;
+      super(query, searcher, SpanCollectorFactory.NO_OP_FACTORY);
     }
 
     @Override
     public PayloadTermSpanScorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
-      TermSpans spans = (TermSpans) query.getSpans(context, acceptDocs, termContexts, payloadCollector);
+      PayloadTermCollector collector = new PayloadTermCollector();
+      TermSpans spans = (TermSpans) query.getSpans(context, acceptDocs, termContexts, collector);
       return (spans == null)
               ? null
-              : new PayloadTermSpanScorer(spans, this, similarity.simScorer(stats, context));
+              : new PayloadTermSpanScorer(spans, this, collector, similarity.simScorer(stats, context));
     }
 
     protected class PayloadTermSpanScorer extends SpanScorer {
       protected BytesRef payload;
       protected float payloadScore;
       protected int payloadsSeen;
-      private final TermSpans termSpans;
+      private final PayloadTermCollector payloadCollector;
 
-      public PayloadTermSpanScorer(TermSpans spans, SpanWeight weight, Similarity.SimScorer docScorer) throws IOException {
+      public PayloadTermSpanScorer(TermSpans spans, SpanWeight weight, PayloadTermCollector collector,
+                                   Similarity.SimScorer docScorer) throws IOException {
         super(spans, weight, docScorer);
-        termSpans = spans; // CHECKME: generics to use SpansScorer.spans as TermSpans.
+        this.payloadCollector = collector;
       }
 
       @Override

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanNearPayloadCheckQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanNearPayloadCheckQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanNearPayloadCheckQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanNearPayloadCheckQuery.java Wed May 20 09:31:26 2015
@@ -18,6 +18,7 @@ package org.apache.lucene.search.payload
 
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.spans.FilterSpans.AcceptStatus;
+import org.apache.lucene.search.spans.SpanCollector;
 import org.apache.lucene.search.spans.SpanNearQuery;
 import org.apache.lucene.search.spans.SpanPositionCheckQuery;
 import org.apache.lucene.search.spans.SpanWeight;
@@ -37,7 +38,6 @@ import java.util.Objects;
 public class SpanNearPayloadCheckQuery extends SpanPositionCheckQuery {
 
   protected final Collection<byte[]> payloadToMatch;
-  protected final PayloadSpanCollector payloadCollector = new PayloadSpanCollector();
 
   /**
    * @param match          The underlying {@link org.apache.lucene.search.spans.SpanQuery} to check
@@ -50,11 +50,13 @@ public class SpanNearPayloadCheckQuery e
 
   @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
-    return new SpanWeight(this, searcher, payloadCollector);
+    return new SpanWeight(this, searcher, PayloadSpanCollector.FACTORY);
   }
 
   @Override
-  protected AcceptStatus acceptPosition(Spans spans) throws IOException {
+  protected AcceptStatus acceptPosition(Spans spans, SpanCollector collector) throws IOException {
+
+    PayloadSpanCollector payloadCollector = (PayloadSpanCollector) collector;
 
     payloadCollector.reset();
     spans.collect(payloadCollector);

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/payloads/SpanPayloadCheckQuery.java Wed May 20 09:31:26 2015
@@ -17,8 +17,8 @@ package org.apache.lucene.search.payload
  */
 
 import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.payloads.PayloadSpanCollector;
 import org.apache.lucene.search.spans.FilterSpans.AcceptStatus;
+import org.apache.lucene.search.spans.SpanCollector;
 import org.apache.lucene.search.spans.SpanNearQuery;
 import org.apache.lucene.search.spans.SpanPositionCheckQuery;
 import org.apache.lucene.search.spans.SpanQuery;
@@ -43,7 +43,6 @@ import java.util.Iterator;
 public class SpanPayloadCheckQuery extends SpanPositionCheckQuery {
 
   protected final Collection<byte[]> payloadToMatch;
-  protected final PayloadSpanCollector payloadCollector = new PayloadSpanCollector();
 
   /**
    * @param match The underlying {@link org.apache.lucene.search.spans.SpanQuery} to check
@@ -59,11 +58,13 @@ public class SpanPayloadCheckQuery exten
 
   @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
-    return new SpanWeight(this, searcher, payloadCollector);
+    return new SpanWeight(this, searcher, PayloadSpanCollector.FACTORY);
   }
 
   @Override
-  protected AcceptStatus acceptPosition(Spans spans) throws IOException {
+  protected AcceptStatus acceptPosition(Spans spans, SpanCollector collector) throws IOException {
+
+    PayloadSpanCollector payloadCollector = (PayloadSpanCollector) collector;
 
     payloadCollector.reset();
     spans.collect(payloadCollector);

Added: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanCollectorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanCollectorFactory.java?rev=1680500&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanCollectorFactory.java (added)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanCollectorFactory.java Wed May 20 09:31:26 2015
@@ -0,0 +1,41 @@
+package org.apache.lucene.search.spans;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Interface defining a factory for creating new {@link SpanCollector}s
+ * @param <T> the SpanCollector type
+ */
+public interface SpanCollectorFactory<T extends SpanCollector> {
+
+  /**
+   * @return a new SpanCollector
+   */
+  T newCollector();
+
+  /**
+   * Factory for creating NO_OP collectors
+   */
+  public static final SpanCollectorFactory<?> NO_OP_FACTORY = new SpanCollectorFactory() {
+    @Override
+    public SpanCollector newCollector() {
+      return SpanCollector.NO_OP;
+    }
+  };
+
+}

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanFirstQuery.java Wed May 20 09:31:26 2015
@@ -37,7 +37,7 @@ public class SpanFirstQuery extends Span
   }
 
   @Override
-  protected AcceptStatus acceptPosition(Spans spans) throws IOException {
+  protected AcceptStatus acceptPosition(Spans spans, SpanCollector collector) throws IOException {
     assert spans.startPosition() != spans.endPosition() : "start equals end: " + spans.startPosition();
     if (spans.startPosition() >= end)
       return AcceptStatus.NO_MORE_IN_CURRENT_DOC;

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionCheckQuery.java Wed May 20 09:31:26 2015
@@ -68,13 +68,14 @@ public abstract class SpanPositionCheckQ
    *
    *
    * @param spans The {@link Spans} instance, positioned at the spot to check
+   * @param collector the {@link SpanCollector} associated with the Spans
    *
    * @return whether the match is accepted, rejected, or rejected and should move to the next doc.
    *
    * @see Spans#nextDoc()
    *
    */
-  protected abstract AcceptStatus acceptPosition(Spans spans) throws IOException;
+  protected abstract AcceptStatus acceptPosition(Spans spans, SpanCollector collector) throws IOException;
 
   @Override
   public Spans getSpans(final LeafReaderContext context, Bits acceptDocs, Map<Term,TermContext> termContexts, SpanCollector collector) throws IOException {
@@ -82,7 +83,7 @@ public abstract class SpanPositionCheckQ
     return (matchSpans == null) ? null : new FilterSpans(matchSpans) {
       @Override
       protected AcceptStatus accept(Spans candidate) throws IOException {
-        return acceptPosition(candidate);
+        return acceptPosition(candidate, collector);
       }
     };
   }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanPositionRangeQuery.java Wed May 20 09:31:26 2015
@@ -40,7 +40,7 @@ public class SpanPositionRangeQuery exte
 
 
   @Override
-  protected AcceptStatus acceptPosition(Spans spans) throws IOException {
+  protected AcceptStatus acceptPosition(Spans spans, SpanCollector collector) throws IOException {
     assert spans.startPosition() != spans.endPosition();
     AcceptStatus res = (spans.startPosition() >= end)
                       ? AcceptStatus.NO_MORE_IN_CURRENT_DOC

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanQuery.java Wed May 20 09:31:26 2015
@@ -53,7 +53,11 @@ public abstract class SpanQuery extends
 
   @Override
   public SpanWeight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException {
-    return new SpanWeight(this, searcher, SpanCollector.NO_OP);
+    return new SpanWeight(this, searcher, getSpanCollectorFactory());
+  }
+
+  protected SpanCollectorFactory<? extends SpanCollector> getSpanCollectorFactory() {
+    return SpanCollectorFactory.NO_OP_FACTORY;
   }
 
 }

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/spans/SpanWeight.java Wed May 20 09:31:26 2015
@@ -44,14 +44,14 @@ public class SpanWeight extends Weight {
   protected final Similarity similarity;
   protected final Map<Term,TermContext> termContexts;
   protected final SpanQuery query;
-  protected final SpanCollector collector;
+  protected final SpanCollectorFactory<?> collectorFactory;
   protected Similarity.SimWeight stats;
 
-  public SpanWeight(SpanQuery query, IndexSearcher searcher, SpanCollector collector) throws IOException {
+  public SpanWeight(SpanQuery query, IndexSearcher searcher, SpanCollectorFactory<?> collectorFactory) throws IOException {
     super(query);
     this.similarity = searcher.getSimilarity();
     this.query = query;
-    this.collector = collector;
+    this.collectorFactory = collectorFactory;
 
     termContexts = new HashMap<>();
     TreeSet<Term> terms = new TreeSet<>();
@@ -73,6 +73,13 @@ public class SpanWeight extends Weight {
     }
   }
 
+  /**
+   * @return the SpanCollectorFactory associated with this SpanWeight
+   */
+  public SpanCollectorFactory<?> getSpanCollectorFactory() {
+    return collectorFactory;
+  }
+
   @Override
   public void extractTerms(Set<Term> terms) {
     query.extractTerms(terms);
@@ -99,7 +106,7 @@ public class SpanWeight extends Weight {
     if (terms != null && terms.hasPositions() == false) {
       throw new IllegalStateException("field \"" + query.getField() + "\" was indexed without position data; cannot run SpanQuery (query=" + query + ")");
     }
-    Spans spans = query.getSpans(context, acceptDocs, termContexts, collector);
+    Spans spans = query.getSpans(context, acceptDocs, termContexts, collectorFactory.newCollector());
     return (spans == null) ? null : new SpanScorer(spans, this, similarity.simScorer(stats, context));
   }
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/payloads/TestPayloadNearQuery.java Wed May 20 09:31:26 2015
@@ -15,9 +15,12 @@ package org.apache.lucene.search.payload
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import java.io.IOException;
 
-import org.apache.lucene.analysis.*;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.MockTokenizer;
+import org.apache.lucene.analysis.TokenFilter;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.Tokenizer;
 import org.apache.lucene.analysis.tokenattributes.PayloadAttribute;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
@@ -27,14 +30,14 @@ import org.apache.lucene.index.RandomInd
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.CollectionStatistics;
 import org.apache.lucene.search.Explanation;
+import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.QueryUtils;
 import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.TermStatistics;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.similarities.DefaultSimilarity;
-import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanNearQuery;
+import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanTermQuery;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
@@ -43,6 +46,7 @@ import org.apache.lucene.util.LuceneTest
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
+import java.io.IOException;
 
 public class TestPayloadNearQuery extends LuceneTestCase {
   private static IndexSearcher searcher;

Modified: lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java?rev=1680500&r1=1680499&r2=1680500&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java (original)
+++ lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java Wed May 20 09:31:26 2015
@@ -48,13 +48,13 @@ import org.apache.lucene.search.TermQuer
 import org.apache.lucene.search.join.ToChildBlockJoinQuery;
 import org.apache.lucene.search.join.ToParentBlockJoinQuery;
 import org.apache.lucene.search.spans.FieldMaskingSpanQuery;
-import org.apache.lucene.search.spans.SpanCollector;
 import org.apache.lucene.search.spans.SpanFirstQuery;
 import org.apache.lucene.search.spans.SpanNearQuery;
 import org.apache.lucene.search.spans.SpanNotQuery;
 import org.apache.lucene.search.spans.SpanOrQuery;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.SpanTermQuery;
+import org.apache.lucene.search.spans.SpanWeight;
 import org.apache.lucene.search.spans.Spans;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.IOUtils;
@@ -303,12 +303,13 @@ public class WeightedSpanTermExtractor {
       LeafReaderContext context = getLeafContext();
       Map<Term,TermContext> termContexts = new HashMap<>();
       TreeSet<Term> extractedTerms = new TreeSet<>();
-      searcher.createNormalizedWeight(q, false).extractTerms(extractedTerms);
+      SpanWeight w = (SpanWeight) searcher.createNormalizedWeight(q, false);
+      w.extractTerms(extractedTerms);
       for (Term term : extractedTerms) {
         termContexts.put(term, TermContext.build(context, term));
       }
       Bits acceptDocs = context.reader().getLiveDocs();
-      final Spans spans = q.getSpans(context, acceptDocs, termContexts, SpanCollector.NO_OP);
+      final Spans spans = q.getSpans(context, acceptDocs, termContexts, w.getSpanCollectorFactory().newCollector());
       if (spans == null) {
         return;
       }