diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 2e2cdb8da34..554880f2835 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -128,6 +128,8 @@ API Changes * LUCENE-9962: DrillSideways allows sub-classes to provide "drill down" FacetsCollectors. They may provide a null collector if they choose to bypass "drill down" facet collection. (Greg Miller) +* LUCENE-8143: SpanBoostQuery has been removed. (Alan Woodward) + Improvements * LUCENE-9960: Avoid unnecessary top element replacement for equal elements in PriorityQueue. (Dawid Weiss) diff --git a/lucene/MIGRATE.md b/lucene/MIGRATE.md index 47fdb03db52..e32cb2c3781 100644 --- a/lucene/MIGRATE.md +++ b/lucene/MIGRATE.md @@ -410,3 +410,8 @@ be as simple as no longer providing this boolean. ## SpanQuery and subclasses have moved from core/ to the queries module They can now be found in the o.a.l.queries.spans package. + +## SpanBoostQuery has been removed (LUCENE-8143) + +SpanBoostQuery was a no-op unless used at the top level of a SpanQuery nested +structure. Use a standard BoostQuery here instead. diff --git a/lucene/highlighter/src/test/org/apache/lucene/search/uhighlight/TestUnifiedHighlighterMTQ.java b/lucene/highlighter/src/test/org/apache/lucene/search/uhighlight/TestUnifiedHighlighterMTQ.java index 96ed91336ee..b12ef3a9ee3 100644 --- a/lucene/highlighter/src/test/org/apache/lucene/search/uhighlight/TestUnifiedHighlighterMTQ.java +++ b/lucene/highlighter/src/test/org/apache/lucene/search/uhighlight/TestUnifiedHighlighterMTQ.java @@ -36,7 +36,6 @@ import org.apache.lucene.document.FieldType; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanFirstQuery; import org.apache.lucene.queries.spans.SpanMultiTermQueryWrapper; import org.apache.lucene.queries.spans.SpanNearQuery; @@ -563,10 +562,7 @@ public class TestUnifiedHighlighterMTQ extends LuceneTestCase { IndexSearcher searcher = newSearcher(ir); UnifiedHighlighter highlighter = randomUnifiedHighlighter(searcher, indexAnalyzer); - // wrap in a SpanBoostQuery to also show we see inside it - Query query = - new SpanBoostQuery( - new SpanMultiTermQueryWrapper<>(new WildcardQuery(new Term("body", "te*"))), 2.0f); + Query query = new SpanMultiTermQueryWrapper<>(new WildcardQuery(new Term("body", "te*"))); TopDocs topDocs = searcher.search(query, 10, Sort.INDEXORDER); assertEquals(2, topDocs.totalHits.value); String snippets[] = highlighter.highlight("body", query, topDocs); diff --git a/lucene/monitor/src/test/org/apache/lucene/monitor/TestSpanExtractors.java b/lucene/monitor/src/test/org/apache/lucene/monitor/TestSpanExtractors.java index e4e802f12b7..6032c10d0bd 100644 --- a/lucene/monitor/src/test/org/apache/lucene/monitor/TestSpanExtractors.java +++ b/lucene/monitor/src/test/org/apache/lucene/monitor/TestSpanExtractors.java @@ -23,7 +23,6 @@ import java.util.HashSet; import java.util.Set; import org.apache.lucene.index.Term; import org.apache.lucene.queries.spans.FieldMaskingSpanQuery; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanContainingQuery; import org.apache.lucene.queries.spans.SpanFirstQuery; import org.apache.lucene.queries.spans.SpanMultiTermQueryWrapper; @@ -122,12 +121,6 @@ public class TestSpanExtractors extends LuceneTestCase { assertEquals(Collections.singleton(t3), collectTerms(swq)); } - public void testSpanBoost() { - Term t1 = new Term("field", "term1"); - SpanBoostQuery q = new SpanBoostQuery(new SpanTermQuery(t1), 0.1f); - assertEquals(Collections.singleton(t1), collectTerms(q)); - } - public void testFieldMaskingSpanQuery() { Term t1 = new Term("field", "term1"); FieldMaskingSpanQuery q = new FieldMaskingSpanQuery(new SpanTermQuery(t1), "field2"); diff --git a/lucene/queries/src/java/org/apache/lucene/queries/spans/SpanBoostQuery.java b/lucene/queries/src/java/org/apache/lucene/queries/spans/SpanBoostQuery.java deleted file mode 100644 index 4b2848fb1f7..00000000000 --- a/lucene/queries/src/java/org/apache/lucene/queries/spans/SpanBoostQuery.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * 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. - */ -package org.apache.lucene.queries.spans; - -import java.io.IOException; -import java.util.Objects; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BoostQuery; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.QueryVisitor; -import org.apache.lucene.search.ScoreMode; - -/** Counterpart of {@link BoostQuery} for spans. */ -public final class SpanBoostQuery extends SpanQuery { - - private final SpanQuery query; - private final float boost; - - /** - * Sole constructor: wrap {@code query} in such a way that the produced scores will be boosted by - * {@code boost}. - */ - public SpanBoostQuery(SpanQuery query, float boost) { - this.query = Objects.requireNonNull(query); - this.boost = boost; - } - - /** Return the wrapped {@link SpanQuery}. */ - public SpanQuery getQuery() { - return query; - } - - /** Return the applied boost. */ - public float getBoost() { - return boost; - } - - @Override - public boolean equals(Object other) { - return sameClassAs(other) && equalsTo(getClass().cast(other)); - } - - private boolean equalsTo(SpanBoostQuery other) { - return query.equals(other.query) - && Float.floatToIntBits(boost) == Float.floatToIntBits(other.boost); - } - - @Override - public int hashCode() { - int h = classHash(); - h = 31 * h + query.hashCode(); - h = 31 * h + Float.floatToIntBits(boost); - return h; - } - - @Override - public Query rewrite(IndexReader reader) throws IOException { - if (boost == 1f) { - return query; - } - - final SpanQuery rewritten = (SpanQuery) query.rewrite(reader); - if (query != rewritten) { - return new SpanBoostQuery(rewritten, boost); - } - - if (query.getClass() == SpanBoostQuery.class) { - SpanBoostQuery in = (SpanBoostQuery) query; - return new SpanBoostQuery(in.query, boost * in.boost); - } - - return super.rewrite(reader); - } - - @Override - public void visit(QueryVisitor visitor) { - if (visitor.acceptField(getField())) { - query.visit(visitor.getSubVisitor(BooleanClause.Occur.MUST, this)); - } - } - - @Override - public String toString(String field) { - StringBuilder builder = new StringBuilder(); - builder.append("("); - builder.append(query.toString(field)); - builder.append(")^"); - builder.append(boost); - return builder.toString(); - } - - @Override - public String getField() { - return query.getField(); - } - - @Override - public SpanWeight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost) - throws IOException { - return query.createWeight(searcher, scoreMode, SpanBoostQuery.this.boost * boost); - } -} diff --git a/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadExplanations.java b/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadExplanations.java index ce1ba5d4f74..03e80d3fb16 100644 --- a/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadExplanations.java +++ b/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadExplanations.java @@ -17,7 +17,6 @@ package org.apache.lucene.queries.payloads; import org.apache.lucene.index.Term; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanNearQuery; import org.apache.lucene.queries.spans.SpanOrQuery; import org.apache.lucene.queries.spans.SpanQuery; @@ -49,26 +48,12 @@ public class TestPayloadExplanations extends BaseExplanationTestCase { } } - public void testPT2() throws Exception { - for (PayloadFunction fn : functions) { - SpanQuery q = pt("w1", fn); - qtest(new SpanBoostQuery(q, 1000), new int[] {0, 1, 2, 3}); - } - } - public void testPT4() throws Exception { for (PayloadFunction fn : functions) { qtest(pt("xx", fn), new int[] {2, 3}); } } - public void testPT5() throws Exception { - for (PayloadFunction fn : functions) { - SpanQuery q = pt("xx", fn); - qtest(new SpanBoostQuery(q, 1000), new int[] {2, 3}); - } - } - /* protected static final String[] docFields = { "w1 w2 w3 w4 w5", diff --git a/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanBoostQuery.java b/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanBoostQuery.java deleted file mode 100644 index b3612ebd5e0..00000000000 --- a/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanBoostQuery.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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. - */ -package org.apache.lucene.queries.spans; - -import org.apache.lucene.index.Term; -import org.apache.lucene.util.LuceneTestCase; - -public class TestSpanBoostQuery extends LuceneTestCase { - - public void testEquals() { - final float boost = random().nextFloat() * 3 - 1; - SpanTermQuery q = new SpanTermQuery(new Term("foo", "bar")); - SpanBoostQuery q1 = new SpanBoostQuery(q, boost); - SpanBoostQuery q2 = new SpanBoostQuery(q, boost); - assertEquals(q1, q2); - assertEquals(q1.getBoost(), q2.getBoost(), 0f); - - float boost2 = boost; - while (boost == boost2) { - boost2 = random().nextFloat() * 3 - 1; - } - SpanBoostQuery q3 = new SpanBoostQuery(q, boost2); - assertFalse(q1.equals(q3)); - assertFalse(q1.hashCode() == q3.hashCode()); - } - - public void testToString() { - assertEquals( - "(foo:bar)^2.0", - new SpanBoostQuery(new SpanTermQuery(new Term("foo", "bar")), 2).toString()); - SpanOrQuery bq = - new SpanOrQuery( - new SpanTermQuery(new Term("foo", "bar")), new SpanTermQuery(new Term("foo", "baz"))); - assertEquals("(spanOr([foo:bar, foo:baz]))^2.0", new SpanBoostQuery(bq, 2).toString()); - } -} diff --git a/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanExplanations.java b/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanExplanations.java index 10835528bf6..1a1e2a7126d 100644 --- a/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanExplanations.java +++ b/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanExplanations.java @@ -46,11 +46,6 @@ public class TestSpanExplanations extends BaseSpanExplanationTestCase { qtest(new BoostQuery(q, 1000), new int[] {0, 1, 2, 3}); } - public void testST3() throws Exception { - SpanQuery q = st("w1"); - bqtest(new SpanBoostQuery(q, 0), new int[] {0, 1, 2, 3}); - } - public void testST4() throws Exception { SpanQuery q = st("xx"); qtest(q, new int[] {2, 3}); @@ -61,11 +56,6 @@ public class TestSpanExplanations extends BaseSpanExplanationTestCase { qtest(new BoostQuery(q, 1000), new int[] {2, 3}); } - public void testST6() throws Exception { - SpanQuery q = st("xx"); - qtest(new SpanBoostQuery(q, 0), new int[] {2, 3}); - } - /* some SpanFirstQueries */ public void testSF1() throws Exception { @@ -78,11 +68,6 @@ public class TestSpanExplanations extends BaseSpanExplanationTestCase { qtest(new BoostQuery(q, 1000), new int[] {0, 1, 2, 3}); } - public void testSF3() throws Exception { - SpanQuery q = sf(("w1"), 1); - bqtest(new SpanBoostQuery(q, 0), new int[] {0, 1, 2, 3}); - } - public void testSF4() throws Exception { SpanQuery q = sf(("xx"), 2); qtest(q, new int[] {2}); @@ -98,11 +83,6 @@ public class TestSpanExplanations extends BaseSpanExplanationTestCase { qtest(new BoostQuery(q, 1000), new int[] {2}); } - public void testSF7() throws Exception { - SpanQuery q = sf(("xx"), 3); - bqtest(new SpanBoostQuery(q, 0), new int[] {2, 3}); - } - /* some SpanOrQueries */ public void testSO1() throws Exception { @@ -194,11 +174,6 @@ public class TestSpanExplanations extends BaseSpanExplanationTestCase { qtest(new BoostQuery(q, 1000), new int[] {0, 1, 2, 3}); } - public void testSNot3() throws Exception { - SpanQuery q = snot(sf("w1", 10), st("QQ")); - bqtest(new SpanBoostQuery(q, 0), new int[] {0, 1, 2, 3}); - } - public void testSNot4() throws Exception { SpanQuery q = snot(sf("w1", 10), st("xx")); qtest(q, new int[] {0, 1, 2, 3}); @@ -209,33 +184,12 @@ public class TestSpanExplanations extends BaseSpanExplanationTestCase { qtest(new BoostQuery(q, 1000), new int[] {0, 1, 2, 3}); } - public void testSNot6() throws Exception { - SpanQuery q = snot(sf("w1", 10), st("xx")); - bqtest(new SpanBoostQuery(q, 0), new int[] {0, 1, 2, 3}); - } - public void testSNot7() throws Exception { SpanQuery f = snear("w1", "w3", 10, true); SpanQuery q = snot(f, st("xx")); qtest(q, new int[] {0, 1, 3}); } - public void testSNot8() throws Exception { - // NOTE: using qtest not bqtest - SpanQuery f = snear("w1", "w3", 10, true); - f = new SpanBoostQuery(f, 0); - SpanQuery q = snot(f, st("xx")); - qtest(q, new int[] {0, 1, 3}); - } - - public void testSNot9() throws Exception { - // NOTE: using qtest not bqtest - SpanQuery t = st("xx"); - t = new SpanBoostQuery(t, 0); - SpanQuery q = snot(snear("w1", "w3", 10, true), t); - qtest(q, new int[] {0, 1, 3}); - } - public void testSNot10() throws Exception { SpanQuery t = st("xx"); SpanQuery q = snot(snear("w1", "w3", 10, true), t); diff --git a/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanSearchEquivalence.java b/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanSearchEquivalence.java index 0e215d5df76..3d4f84bc787 100644 --- a/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanSearchEquivalence.java +++ b/lucene/queries/src/test/org/apache/lucene/queries/spans/TestSpanSearchEquivalence.java @@ -463,18 +463,4 @@ public class TestSpanSearchEquivalence extends SearchEquivalenceTestBase { Query q2 = spanQuery(new SpanContainingQuery(nearQuery, termQuery)); assertSameSet(q1, q2); } - - public void testSpanBoostQuerySimplification() throws Exception { - float b1 = random().nextFloat() * 10; - float b2 = random().nextFloat() * 10; - Term term = randomTerm(); - - Query q1 = new SpanBoostQuery(new SpanBoostQuery(new SpanTermQuery(term), b2), b1); - // Use AssertingQuery to prevent BoostQuery from merging inner and outer boosts - Query q2 = - new SpanBoostQuery( - new AssertingSpanQuery(new SpanBoostQuery(new SpanTermQuery(term), b2)), b1); - - assertSameScores(q1, q2); - } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java index 34b97fe11f9..4dad705b876 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/complexPhrase/ComplexPhraseQueryParser.java @@ -24,7 +24,6 @@ import java.util.Objects; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanNearQuery; import org.apache.lucene.queries.spans.SpanNotQuery; import org.apache.lucene.queries.spans.SpanOrQuery; @@ -380,10 +379,8 @@ public class ComplexPhraseQueryParser extends QueryParser { for (BooleanClause clause : qc) { Query childQuery = clause.getQuery(); - float boost = 1f; while (childQuery instanceof BoostQuery) { BoostQuery bq = (BoostQuery) childQuery; - boost *= bq.getBoost(); childQuery = bq.getQuery(); } @@ -396,9 +393,6 @@ public class ComplexPhraseQueryParser extends QueryParser { if (childQuery instanceof TermQuery) { TermQuery tq = (TermQuery) childQuery; SpanQuery stq = new SpanTermQuery(tq.getTerm()); - if (boost != 1f) { - stq = new SpanBoostQuery(stq, boost); - } chosenList.add(stq); } else if (childQuery instanceof BooleanQuery) { BooleanQuery cbq = (BooleanQuery) childQuery; diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/surround/query/SpanNearClauseFactory.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/surround/query/SpanNearClauseFactory.java index 4a7820b3967..6574b95fa65 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/surround/query/SpanNearClauseFactory.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/surround/query/SpanNearClauseFactory.java @@ -56,7 +56,6 @@ import java.util.HashMap; import java.util.Iterator; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanOrQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queries.spans.SpanTermQuery; @@ -115,11 +114,6 @@ public class SpanNearClauseFactory { // FIXME: rename to SpanClauseFactory if (!(q instanceof SpanQuery)) throw new AssertionError("Expected SpanQuery: " + q.toString(getFieldName())); float boost = 1f; - if (q instanceof SpanBoostQuery) { - SpanBoostQuery bq = (SpanBoostQuery) q; - boost = bq.getBoost(); - q = bq.getQuery(); - } addSpanQueryWeighted((SpanQuery) q, boost); } @@ -129,10 +123,6 @@ public class SpanNearClauseFactory { // FIXME: rename to SpanClauseFactory int i = 0; while (sqi.hasNext()) { SpanQuery sq = sqi.next(); - float boost = weightBySpanQuery.get(sq); - if (boost != 1f) { - sq = new SpanBoostQuery(sq, boost); - } spanQueries[i++] = sq; } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/BoostingTermBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/BoostingTermBuilder.java index 51d1775c2c5..13b86b1b8a7 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/BoostingTermBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/BoostingTermBuilder.java @@ -20,7 +20,6 @@ import org.apache.lucene.index.Term; import org.apache.lucene.queries.payloads.AveragePayloadFunction; import org.apache.lucene.queries.payloads.PayloadDecoder; import org.apache.lucene.queries.payloads.PayloadScoreQuery; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queries.spans.SpanTermQuery; import org.apache.lucene.queryparser.xml.DOMUtils; @@ -36,12 +35,9 @@ public class BoostingTermBuilder extends SpanBuilderBase { String value = DOMUtils.getNonBlankTextOrFail(e); // TODO make function and decoder pluggable somehow? - SpanQuery btq = - new PayloadScoreQuery( - new SpanTermQuery(new Term(fieldName, value)), - new AveragePayloadFunction(), - PayloadDecoder.FLOAT_DECODER); - btq = new SpanBoostQuery(btq, DOMUtils.getAttribute(e, "boost", 1.0f)); - return btq; + return new PayloadScoreQuery( + new SpanTermQuery(new Term(fieldName, value)), + new AveragePayloadFunction(), + PayloadDecoder.FLOAT_DECODER); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanBuilderBase.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanBuilderBase.java index f0bdb11fa75..311bcd75289 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanBuilderBase.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanBuilderBase.java @@ -17,7 +17,9 @@ package org.apache.lucene.queryparser.xml.builders; import org.apache.lucene.queries.spans.SpanQuery; // javadocs +import org.apache.lucene.queryparser.xml.DOMUtils; import org.apache.lucene.queryparser.xml.ParserException; +import org.apache.lucene.search.BoostQuery; import org.apache.lucene.search.Query; import org.w3c.dom.Element; @@ -26,6 +28,11 @@ public abstract class SpanBuilderBase implements SpanQueryBuilder { @Override public Query getQuery(Element e) throws ParserException { - return getSpanQuery(e); + float boost = DOMUtils.getAttribute(e, "boost", 1.0f); + SpanQuery q = getSpanQuery(e); + if (boost == 1.0f) { + return q; + } + return new BoostQuery(q, boost); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanFirstBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanFirstBuilder.java index f240bb74b08..7467d625c18 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanFirstBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanFirstBuilder.java @@ -16,7 +16,6 @@ */ package org.apache.lucene.queryparser.xml.builders; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanFirstQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queryparser.xml.DOMUtils; @@ -38,9 +37,6 @@ public class SpanFirstBuilder extends SpanBuilderBase { Element child = DOMUtils.getFirstChildElement(e); SpanQuery q = factory.getSpanQuery(child); - SpanFirstQuery sfq = new SpanFirstQuery(q, end); - - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(sfq, boost); + return new SpanFirstQuery(q, end); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNearBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNearBuilder.java index e3daaa78d65..9f7ed346cb7 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNearBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNearBuilder.java @@ -18,7 +18,6 @@ package org.apache.lucene.queryparser.xml.builders; import java.util.ArrayList; import java.util.List; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanNearQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queryparser.xml.DOMUtils; @@ -47,8 +46,6 @@ public class SpanNearBuilder extends SpanBuilderBase { } } SpanQuery[] spanQueries = spans.toArray(new SpanQuery[spans.size()]); - SpanQuery snq = new SpanNearQuery(spanQueries, slop, inOrder); - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(snq, boost); + return new SpanNearQuery(spanQueries, slop, inOrder); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNotBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNotBuilder.java index b273a63ec48..01ff0d31484 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNotBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanNotBuilder.java @@ -16,7 +16,6 @@ */ package org.apache.lucene.queryparser.xml.builders; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanNotQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queryparser.xml.DOMUtils; @@ -43,9 +42,6 @@ public class SpanNotBuilder extends SpanBuilderBase { SpanQuery include = factory.getSpanQuery(includeElem); SpanQuery exclude = factory.getSpanQuery(excludeElem); - SpanNotQuery snq = new SpanNotQuery(include, exclude); - - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(snq, boost); + return new SpanNotQuery(include, exclude); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrBuilder.java index 7999e54fc93..207451336e8 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrBuilder.java @@ -18,10 +18,8 @@ package org.apache.lucene.queryparser.xml.builders; import java.util.ArrayList; import java.util.List; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanOrQuery; import org.apache.lucene.queries.spans.SpanQuery; -import org.apache.lucene.queryparser.xml.DOMUtils; import org.apache.lucene.queryparser.xml.ParserException; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -45,8 +43,6 @@ public class SpanOrBuilder extends SpanBuilderBase { } } SpanQuery[] clauses = clausesList.toArray(new SpanQuery[clausesList.size()]); - SpanOrQuery soq = new SpanOrQuery(clauses); - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(soq, boost); + return new SpanOrQuery(clauses); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrTermsBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrTermsBuilder.java index eef8e84dee6..6dc13db7773 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrTermsBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanOrTermsBuilder.java @@ -23,7 +23,6 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute; import org.apache.lucene.index.Term; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanOrQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queries.spans.SpanTermQuery; @@ -57,9 +56,7 @@ public class SpanOrTermsBuilder extends SpanBuilderBase { clausesList.add(stq); } ts.end(); - SpanOrQuery soq = new SpanOrQuery(clausesList.toArray(new SpanQuery[clausesList.size()])); - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(soq, boost); + return new SpanOrQuery(clausesList.toArray(new SpanQuery[clausesList.size()])); } catch (IOException ioe) { throw new ParserException("IOException parsing value:" + value, ioe); } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanPositionRangeBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanPositionRangeBuilder.java index ec2d94c05ce..085e42b4d93 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanPositionRangeBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanPositionRangeBuilder.java @@ -16,7 +16,6 @@ */ package org.apache.lucene.queryparser.xml.builders; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanPositionRangeQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queryparser.xml.DOMUtils; @@ -39,9 +38,6 @@ public class SpanPositionRangeBuilder extends SpanBuilderBase { Element child = DOMUtils.getFirstChildElement(e); SpanQuery q = factory.getSpanQuery(child); - SpanPositionRangeQuery query = new SpanPositionRangeQuery(q, start, end); - - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(query, boost); + return new SpanPositionRangeQuery(q, start, end); } } diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanTermBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanTermBuilder.java index 5938ad20ba5..bb95ad3890b 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanTermBuilder.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/builders/SpanTermBuilder.java @@ -17,7 +17,6 @@ package org.apache.lucene.queryparser.xml.builders; import org.apache.lucene.index.Term; -import org.apache.lucene.queries.spans.SpanBoostQuery; import org.apache.lucene.queries.spans.SpanQuery; import org.apache.lucene.queries.spans.SpanTermQuery; import org.apache.lucene.queryparser.xml.DOMUtils; @@ -31,9 +30,6 @@ public class SpanTermBuilder extends SpanBuilderBase { public SpanQuery getSpanQuery(Element e) throws ParserException { String fieldName = DOMUtils.getAttributeWithInheritanceOrFail(e, "fieldName"); String value = DOMUtils.getNonBlankTextOrFail(e); - SpanTermQuery stq = new SpanTermQuery(new Term(fieldName, value)); - - float boost = DOMUtils.getAttribute(e, "boost", 1.0f); - return new SpanBoostQuery(stq, boost); + return new SpanTermQuery(new Term(fieldName, value)); } } diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/complexPhrase/TestComplexPhraseQuery.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/complexPhrase/TestComplexPhraseQuery.java index 1f3904ade50..6ad454d5dae 100644 --- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/complexPhrase/TestComplexPhraseQuery.java +++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/complexPhrase/TestComplexPhraseQuery.java @@ -20,11 +20,17 @@ import java.util.HashSet; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.analysis.MockSynonymAnalyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.Term; +import org.apache.lucene.queries.spans.SpanNearQuery; +import org.apache.lucene.queries.spans.SpanQuery; +import org.apache.lucene.queries.spans.SpanTermQuery; +import org.apache.lucene.search.BoostQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; @@ -205,6 +211,27 @@ public class TestComplexPhraseQuery extends LuceneTestCase { assertTrue(!q2.equals(q)); } + public void testBoosts() throws Exception { + + // top-level boosts should be preserved, interior boosts are ignored as they don't apply to + // spans + String topLevel = "(\"john^3 smit*\"~4)^2"; + ComplexPhraseQueryParser parser = new ComplexPhraseQueryParser("name", new StandardAnalyzer()); + parser.setInOrder(true); + Query actual = searcher.rewrite(parser.parse(topLevel)); + Query expected = + new BoostQuery( + new SpanNearQuery( + new SpanQuery[] { + new SpanTermQuery(new Term("name", "john")), + new SpanTermQuery(new Term("name", "smith")) + }, + 4, + true), + 2); + assertEquals(expected, actual); + } + @Override public void setUp() throws Exception { super.setUp(); diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestCoreParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestCoreParser.java index 5a2cd244c3c..7a79f15d02e 100644 --- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestCoreParser.java +++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/xml/TestCoreParser.java @@ -16,8 +16,10 @@ */ package org.apache.lucene.queryparser.xml; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.MockAnalyzer; @@ -26,7 +28,10 @@ import org.apache.lucene.analysis.MockTokenizer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.queries.spans.SpanNearQuery; import org.apache.lucene.queries.spans.SpanQuery; +import org.apache.lucene.queries.spans.SpanTermQuery; +import org.apache.lucene.search.BoostQuery; import org.apache.lucene.search.DisjunctionMaxQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; @@ -201,6 +206,39 @@ public class TestCoreParser extends LuceneTestCase { dumpResults("PointRangeQueryWithoutRange", q, 5); } + public void testSpanBoosts() throws Exception { + String topLevel = "value"; + try (ByteArrayInputStream is = + new ByteArrayInputStream(topLevel.getBytes(StandardCharsets.UTF_8))) { + Query actual = coreParser().parse(is); + Query expected = new BoostQuery(new SpanTermQuery(new Term("field", "value")), 2); + assertEquals(expected, actual); + } + + String nested = + "" + + // top level boost is preserved + " value1" + + // interior boost is ignored + " value2" + + ""; + try (ByteArrayInputStream is = + new ByteArrayInputStream(nested.getBytes(StandardCharsets.UTF_8))) { + Query actual = coreParser().parse(is); + Query expected = + new BoostQuery( + new SpanNearQuery( + new SpanQuery[] { + new SpanTermQuery(new Term("field", "value1")), + new SpanTermQuery(new Term("field", "value2")) + }, + 8, + false), + 2); + assertEquals(expected, actual); + } + } + // ================= Helper methods =================================== protected String defaultField() {