A span search optimization.

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@150194 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Doug Cutting 2004-02-09 22:25:51 +00:00
parent a66250c4ab
commit 423c29c749
2 changed files with 64 additions and 29 deletions

View File

@ -175,11 +175,8 @@ class NearSpans implements Spans {
queueStale = false;
}
int matchLength = max.end() - min().start();
if (((matchLength - totalLength) <= slop) // check slop
&& (!inOrder || matchIsOrdered())) { // check order
if (atMatch())
return true;
}
more = min().next(); // trigger further scanning
if (more)
@ -189,24 +186,26 @@ class NearSpans implements Spans {
}
public boolean skipTo(int target) throws IOException {
if (firstTime) {
if (firstTime) { // initialize
initList(false);
firstTime = false;
}
for (SpansCell cell = first; more && cell!=null; cell=cell.next) {
more = cell.skipTo(target);
}
if (more) {
listToQueue();
if (min().doc() == max.doc()) { // at a match?
int matchLength = max.end() - min().start();
if ((matchLength - totalLength) <= slop) {
return true;
}
for (SpansCell cell = first; more && cell!=null; cell=cell.next) {
more = cell.skipTo(target); // skip all
}
if (more) {
listToQueue();
}
firstTime = false;
} else { // normal case
while (more && min().doc() < target) { // skip as needed
more = min().skipTo(target);
if (more)
queue.adjustTop();
}
}
if (more) {
if (atMatch()) // at a match?
return true;
return next(); // no, scan
}
@ -220,6 +219,7 @@ class NearSpans implements Spans {
public int start() { return min().start(); }
public int end() { return max.end(); }
public String toString() {
return "spans("+query.toString()+")@"+
(firstTime?"START":(more?(doc()+":"+start()+"-"+end()):"END"));
@ -266,6 +266,17 @@ class NearSpans implements Spans {
}
}
private boolean atMatch() {
if (min().doc() == max.doc()) { // at a match?
int matchLength = max.end() - min().start();
if (((matchLength - totalLength) <= slop) // check slop
&& (!inOrder || matchIsOrdered())) { // check order
return true;
}
}
return false;
}
private boolean matchIsOrdered() {
int lastStart = -1;
for (int i = 0; i < ordered.size(); i++) {

View File

@ -160,8 +160,8 @@ public class TestBasics extends TestCase {
checkHits(query, new int[]
{77, 177, 277, 377, 477, 577, 677, 777, 877, 977});
//System.out.println(searcher.explain(query, 77));
//System.out.println(searcher.explain(query, 977));
assertTrue(searcher.explain(query, 77).getValue() > 0.0f);
assertTrue(searcher.explain(query, 977).getValue() > 0.0f);
}
public void testSpanNearUnordered() throws Exception {
@ -195,8 +195,8 @@ public class TestBasics extends TestCase {
checkHits(query, new int[]
{801, 821, 831, 851, 861, 871, 881, 891});
//System.out.println(searcher.explain(query, 801));
//System.out.println(searcher.explain(query, 891));
assertTrue(searcher.explain(query, 801).getValue() > 0.0f);
assertTrue(searcher.explain(query, 891).getValue() > 0.0f);
}
public void testSpanFirst() throws Exception {
@ -213,8 +213,8 @@ public class TestBasics extends TestCase {
584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597,
598, 599});
//System.out.println(searcher.explain(query, 5));
//System.out.println(searcher.explain(query, 599));
assertTrue(searcher.explain(query, 5).getValue() > 0.0f);
assertTrue(searcher.explain(query, 599).getValue() > 0.0f);
}
@ -234,8 +234,8 @@ public class TestBasics extends TestCase {
{33, 47, 133, 147, 233, 247, 333, 347, 433, 447, 533, 547, 633, 647, 733,
747, 833, 847, 933, 947});
//System.out.println(searcher.explain(query, 33));
//System.out.println(searcher.explain(query, 947));
assertTrue(searcher.explain(query, 33).getValue() > 0.0f);
assertTrue(searcher.explain(query, 947).getValue() > 0.0f);
}
public void testSpanExactNested() throws Exception {
@ -253,7 +253,7 @@ public class TestBasics extends TestCase {
checkHits(query, new int[] {333});
//System.out.println(searcher.explain(query, 333));
assertTrue(searcher.explain(query, 333).getValue() > 0.0f);
}
public void testSpanNearOr() throws Exception {
@ -277,7 +277,31 @@ public class TestBasics extends TestCase {
756, 757, 766, 767, 776, 777, 786, 787, 796, 797});
}
public void testSpanComplex1() throws Exception {
SpanTermQuery t1 = new SpanTermQuery(new Term("field","six"));
SpanTermQuery t2 = new SpanTermQuery(new Term("field","hundred"));
SpanNearQuery tt1 = new SpanNearQuery(new SpanQuery[] {t1, t2}, 0,true);
SpanTermQuery t3 = new SpanTermQuery(new Term("field","seven"));
SpanTermQuery t4 = new SpanTermQuery(new Term("field","hundred"));
SpanNearQuery tt2 = new SpanNearQuery(new SpanQuery[] {t3, t4}, 0,true);
SpanTermQuery t5 = new SpanTermQuery(new Term("field","seven"));
SpanTermQuery t6 = new SpanTermQuery(new Term("field","six"));
SpanOrQuery to1 = new SpanOrQuery(new SpanQuery[] {tt1, tt2});
SpanOrQuery to2 = new SpanOrQuery(new SpanQuery[] {t5, t6});
SpanNearQuery query = new SpanNearQuery(new SpanQuery[] {to1, to2},
100, true);
checkHits(query, new int[]
{606, 607, 626, 627, 636, 637, 646, 647,
656, 657, 666, 667, 676, 677, 686, 687, 696, 697,
706, 707, 726, 727, 736, 737, 746, 747,
756, 757, 766, 767, 776, 777, 786, 787, 796, 797});
}
private void checkHits(Query query, int[] results) throws IOException {