@Test public void testSpanExactNested() throws Exception { this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "three")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "hundred")); NearSpanQuery near1 = new NearSpanQuery(new TermSpanQuery[] {term1, term2}, 0, true); TermSpanQuery term3 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "thirty")); TermSpanQuery term4 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "three")); NearSpanQuery near2 = new NearSpanQuery(new TermSpanQuery[] {term3, term4}, 0, true); NearSpanQuery query = new NearSpanQuery(new SpanQuery[] {near1, near2}, 0, true); checkHits(query, new int[] {333, 1333}); // assertTrue(searcher.explain(query, 333).getValue() > 0.0f); }
@Test public void testSetLevelConstraint() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); final NearSpanQuery nsq1 = new NearSpanQuery(new SpanQuery[] {term1, term2}, 0, true); nsq1.setLevelConstraint(3); assertEquals(3, nsq1.getLevelConstraint()); // Level constraint must have been transferred to the clauses assertEquals(3, nsq1.getClauses()[0].getLevelConstraint()); assertEquals(3, nsq1.getClauses()[1].getLevelConstraint()); NodeSpanQuery term3 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term4 = new NodeSpanQuery(ntq("bbb").getQuery()); final NearSpanQuery nsq2 = new NearSpanQuery(new SpanQuery[] {term3, term4}, 0, true); nsq2.setLevelConstraint(4); final NearSpanQuery nsq3 = new NearSpanQuery(new SpanQuery[] {nsq1, nsq2}, 0, true); nsq3.setLevelConstraint(6); // Level constraint must have been transferred to the clauses assertEquals(6, nsq1.getLevelConstraint()); assertEquals(6, nsq2.getLevelConstraint()); }
@Test public void testSetAncestorPointer() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); final NearSpanQuery nsq1 = new NearSpanQuery(new SpanQuery[] {term1, term2}, 0, true); final TwigQuery twig = new TwigQuery(); nsq1.setAncestorPointer(twig); assertSame(twig, nsq1.getAncestorPointer()); // clauses must have been updated assertSame(twig, term1.getAncestorPointer()); }
@Test public void testEquality() throws Exception { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); final NearSpanQuery nsq1 = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 0, true); NodeSpanQuery term3 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term4 = new NodeSpanQuery(ntq("bbb").getQuery()); final NearSpanQuery nsq2 = new NearSpanQuery(new NodeSpanQuery[] {term3, term4}, 0, true); assertEquals(nsq1, nsq2); final NearSpanQuery nsq3 = new NearSpanQuery(new NodeSpanQuery[] {term3, term4}, 1, true); assertNotEquals(nsq1, nsq3); NodeSpanQuery term5 = new NodeSpanQuery(ntq("ccc").getQuery()); final NearSpanQuery nsq4 = new NearSpanQuery(new NodeSpanQuery[] {term1, term5}, 0, true); assertNotEquals(nsq1, nsq4); final NearSpanQuery nsq5 = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 0, true); nsq5.setLevelConstraint(3); assertNotEquals(nsq1, nsq5); final NearSpanQuery nsq6 = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 0, true); nsq6.setNodeConstraint(5); assertNotEquals(nsq1, nsq6); }
/** Returns true if <code>o</code> is equal to this. */ @Override public boolean equals(final Object o) { if (!(o instanceof NearSpanQuery)) return false; final NearSpanQuery other = (NearSpanQuery) o; return (this.getBoost() == other.getBoost()) && this.clauses.equals(other.clauses) && this.inOrder == other.inOrder && this.slop == other.slop && this.levelConstraint == other.levelConstraint && this.lowerBound == other.lowerBound && this.upperBound == other.upperBound; }
@Test public void testSetLevelConstraint() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); final BooleanSpanQuery bsq1 = new BooleanSpanQuery(0, true); bsq1.add(term1, NodeBooleanClause.Occur.MUST); bsq1.add(term2, NodeBooleanClause.Occur.MUST); bsq1.setLevelConstraint(3); assertEquals(3, bsq1.getLevelConstraint()); // Level constraint must have been transferred to the clauses assertEquals(3, bsq1.getClauses()[0].getQuery().getLevelConstraint()); assertEquals(3, bsq1.getClauses()[1].getQuery().getLevelConstraint()); NodeSpanQuery term3 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term4 = new NodeSpanQuery(ntq("bbb").getQuery()); final BooleanSpanQuery bsq2 = new BooleanSpanQuery(0, true); bsq2.add(term3, NodeBooleanClause.Occur.MUST); bsq2.add(term4, NodeBooleanClause.Occur.MUST); bsq2.setLevelConstraint(4); final NearSpanQuery nsq3 = new NearSpanQuery(new SpanQuery[] {bsq1, bsq2}, 0, true); nsq3.setLevelConstraint(6); // Level constraint must have been transferred to the clauses assertEquals(6, bsq1.getLevelConstraint()); assertEquals(6, bsq1.getLevelConstraint()); }
@Override public Scorer scorer(final AtomicReaderContext context, final Bits acceptDocs) throws IOException { final List<Spans> spans = new ArrayList<Spans>(); for (final Weight w : weights) { final Scorer scorer = w.scorer(context, acceptDocs); if (scorer == null) { return null; } if (!(scorer instanceof SpanScorer)) { throw new IllegalArgumentException("SpanScorer expected"); } spans.add(((SpanScorer) scorer).getSpans()); } int slop = NearSpanQuery.this.getSlop(); NearSpans nearSpans = inOrder ? new NearSpansOrdered(spans, slop) : new NearSpansUnordered(spans, slop); return new SpanScorer(this, nearSpans); }
@Override public int hashCode() { return Float.floatToIntBits(this.getBoost()) ^ clauses.hashCode() ^ slop ^ (inOrder ? 0x99AFD3BD : 0) ^ levelConstraint ^ upperBound ^ lowerBound; } }
@Test public void testNpeInSpanNearWithSpanNot() throws Exception { this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "eight")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "one")); NearSpanQuery near = new NearSpanQuery(new TermSpanQuery[]{term1, term2}, 4, true); TermSpanQuery hun = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "hundred")); TermSpanQuery term3 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "forty")); NearSpanQuery exclude = new NearSpanQuery(new TermSpanQuery[]{hun, term3}, 1, true); NotSpanQuery query = new NotSpanQuery(near, exclude); checkHits(query, new int[]{801, 821, 831, 851, 861, 871, 881, 891, 1801, 1821, 1831, 1851, 1861, 1871, 1881, 1891}); }
@Override public float getValueForNormalization() throws IOException { float sum = 0.0f; for (int i = 0; i < weights.size(); i++) { sum += weights.get(i).getValueForNormalization(); // sum sub weights } // boost each sub-weight sum *= NearSpanQuery.this.getBoost() * NearSpanQuery.this.getBoost(); return sum; }
@Test public void testSpanOr() throws Exception { this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "thirty")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "three")); NearSpanQuery near1 = new NearSpanQuery(new TermSpanQuery[] {term1, term2}, 0, true); TermSpanQuery term3 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "forty")); TermSpanQuery term4 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "seven")); NearSpanQuery near2 = new NearSpanQuery(new TermSpanQuery[] {term3, term4}, 0, true); OrSpanQuery query = new OrSpanQuery(near1, near2); checkHits(query, new int[] { 33, 47, 133, 147, 233, 247, 333, 347, 433, 447, 533, 547, 633, 647, 733, 747, 833, 847, 933, 947, 1033, 1047, 1133, 1147, 1233, 1247, 1333, 1347, 1433, 1447, 1533, 1547, 1633, 1647, 1733, 1747, 1833, 1847, 1933, 1947}); }
@Override public void normalize(final float norm, float topLevelBoost) { // incorporate boost topLevelBoost *= NearSpanQuery.this.getBoost(); for (final Weight w : weights) { // normalize all clauses w.normalize(norm, topLevelBoost); } }
@Test public void testSpanNearOrdered() throws Exception { this.addDocuments(this.generateDocuments(1000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "nine")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "six")); NearSpanQuery query = new NearSpanQuery(new TermSpanQuery[] {term1, term2}, 4, true); checkHits(query, 906, 926, 936, 946, 956, 966, 976, 986, 996); }
@Override public String toString(final String field) { StringBuilder buffer = new StringBuilder(); buffer.append("spanNear(["); Iterator<SpanQuery> i = clauses.iterator(); while (i.hasNext()) { SpanQuery clause = i.next(); buffer.append(clause.toString(field)); if (i.hasNext()) { buffer.append(", "); } } buffer.append("], "); buffer.append(slop); buffer.append(", "); buffer.append(inOrder); buffer.append(")"); buffer.append(ToStringUtils.boost(getBoost())); return buffer.toString(); }
@Test public void testSpanNearUnordered() throws Exception { this.addDocuments(this.generateDocuments(1000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "nine")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "six")); NearSpanQuery query = new NearSpanQuery(new TermSpanQuery[] {term1, term2}, 4, false); checkHits(query, 609, 629, 639, 649, 659, 669, 679, 689, 699, 906, 926, 936, 946, 956, 966, 976, 986, 996); }
@Test public void testSpanNot() throws Exception { this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "eight")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "one")); NearSpanQuery near = new NearSpanQuery(new TermSpanQuery[]{term1, term2}, 4, true); TermSpanQuery term3 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "forty")); SpanQuery query = new NotSpanQuery(near, term3); checkHits(query, new int[]{801, 821, 831, 851, 861, 871, 881, 891, 1801, 1821, 1831, 1851, 1861, 1871, 1881, 1891}); }
@Test public void testSpanNotWindowOne() throws Exception { this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "eight")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "forty")); NearSpanQuery near = new NearSpanQuery(new TermSpanQuery[]{term1, term2}, 4, true); TermSpanQuery term3 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "one")); SpanQuery query = new NotSpanQuery(near, term3, 1, 1); checkHits(query, new int[]{840, 842, 843, 844, 845, 846, 847, 848, 849, 1840, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849}); }
@Test public void testSpanNotWindowTwoBefore() throws Exception { this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "eight")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "forty")); NearSpanQuery near = new NearSpanQuery(new TermSpanQuery[]{term1, term2}, 4, true); TermSpanQuery term3 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "one")); NotSpanQuery query = new NotSpanQuery(near, term3, 2, 0); checkHits(query, new int[]{840, 841, 842, 843, 844, 845, 846, 847, 848, 849}); }
@Test public void testSpanNotWindowDoubleExcludesBefore() throws Exception { // test hitting two excludes before an include this.addDocuments(this.generateDocuments(2000)); TermSpanQuery term1 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "forty")); TermSpanQuery term2 = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "two")); NearSpanQuery near = new NearSpanQuery(new TermSpanQuery[]{term1, term2}, 2, true); TermSpanQuery exclude = new TermSpanQuery(new Term(DEFAULT_TEST_FIELD, "one")); SpanQuery query = new NotSpanQuery(near, exclude, 4, 1); checkHits(query, new int[]{42, 242, 342, 442, 542, 642, 742, 842, 942}); }