You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2015/04/03 16:55:19 UTC
svn commit: r1671081 - in /lucene/dev/branches/branch_5x: ./ lucene/
lucene/core/ lucene/core/src/java/org/apache/lucene/search/spans/
Author: rmuir
Date: Fri Apr 3 14:55:18 2015
New Revision: 1671081
URL: http://svn.apache.org/r1671081
Log:
LUCENE-6388: Optimize SpanNearQuery
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/lucene/core/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpans.java
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansPayloadOrdered.java
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java
Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1671081&r1=1671080&r2=1671081&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Fri Apr 3 14:55:18 2015
@@ -23,6 +23,9 @@ Optimizations
faster IndexWriter.deleteAll in that case (Robert Muir, Adrien
Grand, Mike McCandless)
+* LUCENE-6388: Optimize SpanNearQuery when payloads are not present.
+ (Robert Muir)
+
Bug Fixes
* LUCENE-6378: Fix all RuntimeExceptions to throw the underlying root cause.
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpans.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpans.java?rev=1671081&r1=1671080&r2=1671081&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpans.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpans.java Fri Apr 3 14:55:18 2015
@@ -29,11 +29,11 @@ import java.util.Objects;
* Common super class for un/ordered Spans
*/
abstract class NearSpans extends Spans {
- SpanNearQuery query;
- int allowedSlop;
+ final SpanNearQuery query;
+ final int allowedSlop;
- List<Spans> subSpans; // in query order
- DocIdSetIterator conjunction; // use to move to next doc with all clauses
+ final Spans[] subSpans; // in query order
+ final DocIdSetIterator conjunction; // use to move to next doc with all clauses
boolean atFirstInCurrentDoc;
boolean oneExhaustedInCurrentDoc; // no more results possbile in current doc
@@ -44,7 +44,7 @@ abstract class NearSpans extends Spans {
if (subSpans.size() < 2) {
throw new IllegalArgumentException("Less than 2 subSpans: " + query);
}
- this.subSpans = Objects.requireNonNull(subSpans); // in query order
+ this.subSpans = subSpans.toArray(new Spans[subSpans.size()]); // in query order
this.conjunction = ConjunctionDISI.intersect(subSpans);
}
@@ -91,13 +91,8 @@ abstract class NearSpans extends Spans {
return res;
}
- private Spans[] subSpansArray = null; // init only when needed.
-
public Spans[] getSubSpans() {
- if (subSpansArray == null) {
- subSpansArray = subSpans.toArray(new Spans[subSpans.size()]);
- }
- return subSpansArray;
+ return subSpans;
}
}
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java?rev=1671081&r1=1671080&r2=1671081&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansOrdered.java Fri Apr 3 14:55:18 2015
@@ -18,12 +18,8 @@ package org.apache.lucene.search.spans;
*/
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.Collection;
-import java.util.Set;
/** A Spans that is formed from the ordered subspans of a SpanNearQuery
* where the subspans do not overlap and have a maximum slop between them,
@@ -146,11 +142,11 @@ public class NearSpansOrdered extends Ne
* otherwise at least one is exhausted in the current doc.
*/
private boolean stretchToOrder() throws IOException {
- Spans prevSpans = subSpans.get(0);
+ Spans prevSpans = subSpans[0];
assert prevSpans.startPosition() != NO_MORE_POSITIONS : "prevSpans no start position "+prevSpans;
assert prevSpans.endPosition() != NO_MORE_POSITIONS;
- for (int i = 1; i < subSpans.size(); i++) {
- Spans spans = subSpans.get(i);
+ for (int i = 1; i < subSpans.length; i++) {
+ Spans spans = subSpans[i];
assert spans.startPosition() != NO_MORE_POSITIONS;
assert spans.endPosition() != NO_MORE_POSITIONS;
@@ -169,15 +165,14 @@ public class NearSpansOrdered extends Ne
* on all subSpans, except the last one, in reverse order.
*/
protected boolean shrinkToAfterShortestMatch() throws IOException {
- Spans lastSubSpans = subSpans.get(subSpans.size() - 1);
+ Spans lastSubSpans = subSpans[subSpans.length - 1];
matchStart = lastSubSpans.startPosition();
matchEnd = lastSubSpans.endPosition();
int matchSlop = 0;
int lastStart = matchStart;
- int lastEnd = matchEnd;
- for (int i = subSpans.size() - 2; i >= 0; i--) {
- Spans prevSpans = subSpans.get(i);
+ for (int i = subSpans.length - 2; i >= 0; i--) {
+ Spans prevSpans = subSpans[i];
int prevStart = prevSpans.startPosition();
int prevEnd = prevSpans.endPosition();
@@ -206,7 +201,6 @@ public class NearSpansOrdered extends Ne
*/
matchStart = prevStart;
lastStart = prevStart;
- lastEnd = prevEnd;
}
boolean match = matchSlop <= allowedSlop;
@@ -224,16 +218,14 @@ public class NearSpansOrdered extends Ne
return atFirstInCurrentDoc ? -1 : matchEnd;
}
- /** Throws an UnsupportedOperationException */
@Override
public Collection<byte[]> getPayload() throws IOException {
- throw new UnsupportedOperationException("Use NearSpansPayloadOrdered instead");
+ return null;
}
- /** Throws an UnsupportedOperationException */
@Override
public boolean isPayloadAvailable() {
- throw new UnsupportedOperationException("Use NearSpansPayloadOrdered instead");
+ return false;
}
@Override
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansPayloadOrdered.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansPayloadOrdered.java?rev=1671081&r1=1671080&r2=1671081&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansPayloadOrdered.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/NearSpansPayloadOrdered.java Fri Apr 3 14:55:18 2015
@@ -47,7 +47,7 @@ public class NearSpansPayloadOrdered ext
* Also collect the payloads.
*/
protected boolean shrinkToAfterShortestMatch() throws IOException {
- Spans lastSubSpans = subSpans.get(subSpans.size() - 1);
+ Spans lastSubSpans = subSpans[subSpans.length - 1];
matchStart = lastSubSpans.startPosition();
matchEnd = lastSubSpans.endPosition();
@@ -62,9 +62,8 @@ public class NearSpansPayloadOrdered ext
int matchSlop = 0;
int lastStart = matchStart;
- int lastEnd = matchEnd;
- for (int i = subSpans.size() - 2; i >= 0; i--) {
- Spans prevSpans = subSpans.get(i);
+ for (int i = subSpans.length - 2; i >= 0; i--) {
+ Spans prevSpans = subSpans[i];
if (prevSpans.isPayloadAvailable()) {
Collection<byte[]> payload = prevSpans.getPayload();
@@ -112,7 +111,6 @@ public class NearSpansPayloadOrdered ext
*/
matchStart = prevStart;
lastStart = prevStart;
- lastEnd = prevEnd;
}
boolean match = matchSlop <= allowedSlop;
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java?rev=1671081&r1=1671080&r2=1671081&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/search/spans/SpanNearQuery.java Fri Apr 3 14:55:18 2015
@@ -18,19 +18,17 @@ package org.apache.lucene.search.spans;
*/
import java.io.IOException;
-
-
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
-
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermContext;
+import org.apache.lucene.index.Terms;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.ToStringUtils;
@@ -131,10 +129,15 @@ public class SpanNearQuery extends SpanQ
return null; // all required
}
}
+
+ Terms terms = context.reader().terms(field);
+ if (terms == null) {
+ return null; // field does not exist
+ }
// all NearSpans require at least two subSpans
return (! inOrder) ? new NearSpansUnordered(this, subSpans)
- : collectPayloads ? new NearSpansPayloadOrdered(this, subSpans)
+ : collectPayloads && terms.hasPayloads() ? new NearSpansPayloadOrdered(this, subSpans)
: new NearSpansOrdered(this, subSpans);
}