|
@@ -52,6 +52,7 @@ import org.apache.lucene.search.spans.SpanNotQuery;
|
|
|
import org.apache.lucene.search.spans.SpanOrQuery;
|
|
|
import org.apache.lucene.search.spans.SpanTermQuery;
|
|
|
import org.apache.lucene.util.BytesRef;
|
|
|
+import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.common.lucene.search.function.CombineFunction;
|
|
|
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
|
|
|
import org.elasticsearch.common.lucene.search.function.RandomScoreFunction;
|
|
@@ -63,12 +64,9 @@ import org.elasticsearch.test.ESTestCase;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
-import java.util.Collections;
|
|
|
import java.util.Comparator;
|
|
|
-import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
import java.util.function.Consumer;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -84,8 +82,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
public void testExtractQueryMetadata_termQuery() {
|
|
|
TermQuery termQuery = new TermQuery(new Term("_field", "_term"));
|
|
|
- Result result = analyze(termQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(termQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
assertThat(terms.size(), equalTo(1));
|
|
|
assertThat(terms.get(0).field(), equalTo(termQuery.getTerm().field()));
|
|
@@ -94,8 +93,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
public void testExtractQueryMetadata_termsQuery() {
|
|
|
TermInSetQuery termsQuery = new TermInSetQuery("_field", new BytesRef("_term1"), new BytesRef("_term2"));
|
|
|
- Result result = analyze(termsQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(termsQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(2));
|
|
@@ -107,23 +107,55 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
public void testExtractQueryMetadata_phraseQuery() {
|
|
|
PhraseQuery phraseQuery = new PhraseQuery("_field", "_term1", "term2");
|
|
|
- Result result = analyze(phraseQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(phraseQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
- assertThat(terms.size(), equalTo(1));
|
|
|
+ terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
+ assertThat(terms.size(), equalTo(2));
|
|
|
assertThat(terms.get(0).field(), equalTo(phraseQuery.getTerms()[0].field()));
|
|
|
assertThat(terms.get(0).bytes(), equalTo(phraseQuery.getTerms()[0].bytes()));
|
|
|
+ assertThat(terms.get(1).field(), equalTo(phraseQuery.getTerms()[1].field()));
|
|
|
+ assertThat(terms.get(1).bytes(), equalTo(phraseQuery.getTerms()[1].bytes()));
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_multiPhraseQuery() {
|
|
|
+ MultiPhraseQuery multiPhraseQuery = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("_field", "_term1"))
|
|
|
+ .add(new Term[] {new Term("_field", "_term2"), new Term("_field", "_term3")})
|
|
|
+ .add(new Term[] {new Term("_field", "_term4"), new Term("_field", "_term5")})
|
|
|
+ .add(new Term[] {new Term("_field", "_term6")})
|
|
|
+ .build();
|
|
|
+ Result result = analyze(multiPhraseQuery, Version.CURRENT);
|
|
|
+ assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(4));
|
|
|
+ List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
+ terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
+ assertThat(terms.size(), equalTo(6));
|
|
|
+ assertThat(terms.get(0).field(), equalTo("_field"));
|
|
|
+ assertThat(terms.get(0).bytes().utf8ToString(), equalTo("_term1"));
|
|
|
+ assertThat(terms.get(1).field(), equalTo("_field"));
|
|
|
+ assertThat(terms.get(1).bytes().utf8ToString(), equalTo("_term2"));
|
|
|
+ assertThat(terms.get(2).field(), equalTo("_field"));
|
|
|
+ assertThat(terms.get(2).bytes().utf8ToString(), equalTo("_term3"));
|
|
|
+ assertThat(terms.get(3).field(), equalTo("_field"));
|
|
|
+ assertThat(terms.get(3).bytes().utf8ToString(), equalTo("_term4"));
|
|
|
+ assertThat(terms.get(4).field(), equalTo("_field"));
|
|
|
+ assertThat(terms.get(4).bytes().utf8ToString(), equalTo("_term5"));
|
|
|
+ assertThat(terms.get(5).field(), equalTo("_field"));
|
|
|
+ assertThat(terms.get(5).bytes().utf8ToString(), equalTo("_term6"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testExtractQueryMetadata_multiPhraseQuery_pre6dot1() {
|
|
|
MultiPhraseQuery multiPhraseQuery = new MultiPhraseQuery.Builder()
|
|
|
.add(new Term("_field", "_long_term"))
|
|
|
.add(new Term[] {new Term("_field", "_long_term"), new Term("_field", "_term")})
|
|
|
.add(new Term[] {new Term("_field", "_long_term"), new Term("_field", "_very_long_term")})
|
|
|
.add(new Term[] {new Term("_field", "_very_long_term")})
|
|
|
.build();
|
|
|
- Result result = analyze(multiPhraseQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(multiPhraseQuery, Version.V_6_0_0);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
assertThat(terms.size(), equalTo(1));
|
|
|
assertThat(terms.get(0).field(), equalTo("_field"));
|
|
@@ -131,6 +163,39 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_booleanQuery() {
|
|
|
+ BooleanQuery.Builder builder = new BooleanQuery.Builder();
|
|
|
+ TermQuery termQuery1 = new TermQuery(new Term("_field", "term0"));
|
|
|
+ builder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
|
+ PhraseQuery phraseQuery = new PhraseQuery("_field", "term1", "term2");
|
|
|
+ builder.add(phraseQuery, BooleanClause.Occur.SHOULD);
|
|
|
+
|
|
|
+ BooleanQuery.Builder subBuilder = new BooleanQuery.Builder();
|
|
|
+ TermQuery termQuery2 = new TermQuery(new Term("_field1", "term4"));
|
|
|
+ subBuilder.add(termQuery2, BooleanClause.Occur.MUST);
|
|
|
+ TermQuery termQuery3 = new TermQuery(new Term("_field3", "term5"));
|
|
|
+ subBuilder.add(termQuery3, BooleanClause.Occur.MUST);
|
|
|
+ builder.add(subBuilder.build(), BooleanClause.Occur.SHOULD);
|
|
|
+
|
|
|
+ BooleanQuery booleanQuery = builder.build();
|
|
|
+ Result result = analyze(booleanQuery, Version.CURRENT);
|
|
|
+ assertThat("Should clause with phrase query isn't verified, so entire query can't be verified", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
+ terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
+ assertThat(terms.size(), equalTo(5));
|
|
|
+ assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field()));
|
|
|
+ assertThat(terms.get(0).bytes(), equalTo(termQuery1.getTerm().bytes()));
|
|
|
+ assertThat(terms.get(1).field(), equalTo(phraseQuery.getTerms()[0].field()));
|
|
|
+ assertThat(terms.get(1).bytes(), equalTo(phraseQuery.getTerms()[0].bytes()));
|
|
|
+ assertThat(terms.get(2).field(), equalTo(phraseQuery.getTerms()[1].field()));
|
|
|
+ assertThat(terms.get(2).bytes(), equalTo(phraseQuery.getTerms()[1].bytes()));
|
|
|
+ assertThat(terms.get(3).field(), equalTo(termQuery2.getTerm().field()));
|
|
|
+ assertThat(terms.get(3).bytes(), equalTo(termQuery2.getTerm().bytes()));
|
|
|
+ assertThat(terms.get(4).field(), equalTo(termQuery3.getTerm().field()));
|
|
|
+ assertThat(terms.get(4).bytes(), equalTo(termQuery3.getTerm().bytes()));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testExtractQueryMetadata_booleanQuery_pre6dot1() {
|
|
|
BooleanQuery.Builder builder = new BooleanQuery.Builder();
|
|
|
TermQuery termQuery1 = new TermQuery(new Term("_field", "_term"));
|
|
|
builder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
@@ -145,8 +210,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(subBuilder.build(), BooleanClause.Occur.SHOULD);
|
|
|
|
|
|
BooleanQuery booleanQuery = builder.build();
|
|
|
- Result result = analyze(booleanQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(booleanQuery, Version.V_6_0_0);
|
|
|
assertThat("Should clause with phrase query isn't verified, so entire query can't be verified", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(3));
|
|
@@ -173,8 +239,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(subBuilder.build(), BooleanClause.Occur.SHOULD);
|
|
|
|
|
|
BooleanQuery booleanQuery = builder.build();
|
|
|
- Result result = analyze(booleanQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(booleanQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryAnalyzer.QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(4));
|
|
@@ -196,12 +263,16 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(phraseQuery, BooleanClause.Occur.SHOULD);
|
|
|
|
|
|
BooleanQuery booleanQuery = builder.build();
|
|
|
- Result result = analyze(booleanQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(booleanQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
- assertThat(terms.size(), equalTo(1));
|
|
|
+ assertThat(terms.size(), equalTo(2));
|
|
|
+ terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.get(0).field(), equalTo(phraseQuery.getTerms()[0].field()));
|
|
|
assertThat(terms.get(0).bytes(), equalTo(phraseQuery.getTerms()[0].bytes()));
|
|
|
+ assertThat(terms.get(1).field(), equalTo(phraseQuery.getTerms()[1].field()));
|
|
|
+ assertThat(terms.get(1).bytes(), equalTo(phraseQuery.getTerms()[1].bytes()));
|
|
|
}
|
|
|
|
|
|
public void testExactMatch_booleanQuery() {
|
|
@@ -210,59 +281,119 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
|
TermQuery termQuery2 = new TermQuery(new Term("_field", "_term2"));
|
|
|
builder.add(termQuery2, BooleanClause.Occur.SHOULD);
|
|
|
- Result result = analyze(builder.build(), Collections.emptyMap());
|
|
|
+ Result result = analyze(builder.build(), Version.CURRENT);
|
|
|
assertThat("All clauses are exact, so candidate matches are verified", result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
|
PhraseQuery phraseQuery1 = new PhraseQuery("_field", "_term1", "_term2");
|
|
|
builder.add(phraseQuery1, BooleanClause.Occur.SHOULD);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
assertThat("Clause isn't exact, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(phraseQuery1, BooleanClause.Occur.SHOULD);
|
|
|
PhraseQuery phraseQuery2 = new PhraseQuery("_field", "_term3", "_term4");
|
|
|
builder.add(phraseQuery2, BooleanClause.Occur.SHOULD);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
assertThat("No clause is exact, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(termQuery1, BooleanClause.Occur.MUST_NOT);
|
|
|
builder.add(termQuery2, BooleanClause.Occur.SHOULD);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
assertThat("There is a must_not clause, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.setMinimumNumberShouldMatch(randomIntBetween(2, 32));
|
|
|
builder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
|
builder.add(termQuery2, BooleanClause.Occur.SHOULD);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
- assertThat("Minimum match is >= 1, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Minimum match has not impact on whether the result is verified", result.verified, is(true));
|
|
|
+ assertThat("msm is at least two so result.minimumShouldMatch should 2 too", result.minimumShouldMatch, equalTo(2));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(termQuery1, randomBoolean() ? BooleanClause.Occur.MUST : BooleanClause.Occur.FILTER);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
- assertThat("Single required clause, so candidate matches are verified", result.verified, is(false));
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Also required clauses are taken into account whether the result is verified", result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(termQuery1, randomBoolean() ? BooleanClause.Occur.MUST : BooleanClause.Occur.FILTER);
|
|
|
builder.add(termQuery2, randomBoolean() ? BooleanClause.Occur.MUST : BooleanClause.Occur.FILTER);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
- assertThat("Two or more required clauses, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Also required clauses are taken into account whether the result is verified", result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(termQuery1, randomBoolean() ? BooleanClause.Occur.MUST : BooleanClause.Occur.FILTER);
|
|
|
builder.add(termQuery2, BooleanClause.Occur.MUST_NOT);
|
|
|
- result = analyze(builder.build(), Collections.emptyMap());
|
|
|
- assertThat("Required and prohibited clauses, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Prohibited clause, so candidate matches are not verified", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testBooleanQueryWithMustAndShouldClauses() {
|
|
|
+ BooleanQuery.Builder builder = new BooleanQuery.Builder();
|
|
|
+ TermQuery termQuery1 = new TermQuery(new Term("_field", "_term1"));
|
|
|
+ builder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
|
+ TermQuery termQuery2 = new TermQuery(new Term("_field", "_term2"));
|
|
|
+ builder.add(termQuery2, BooleanClause.Occur.SHOULD);
|
|
|
+ TermQuery termQuery3 = new TermQuery(new Term("_field", "_term3"));
|
|
|
+ builder.add(termQuery3, BooleanClause.Occur.MUST);
|
|
|
+ Result result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Must clause is exact, so this is a verified candidate match", result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ assertThat(result.extractions.size(), equalTo(1));
|
|
|
+ List<QueryExtraction> extractions = new ArrayList<>(result.extractions);
|
|
|
+ assertThat(extractions.get(0).term, equalTo(new Term("_field", "_term3")));
|
|
|
+
|
|
|
+ builder.setMinimumNumberShouldMatch(1);
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Must clause is exact, but m_s_m is 1 so one should clause must match too", result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ assertThat(result.extractions.size(), equalTo(1));
|
|
|
+ extractions = new ArrayList<>(result.extractions);
|
|
|
+ assertThat(extractions.get(0).term, equalTo(new Term("_field", "_term3")));
|
|
|
+
|
|
|
+ builder = new BooleanQuery.Builder();
|
|
|
+ BooleanQuery.Builder innerBuilder = new BooleanQuery.Builder();
|
|
|
+ innerBuilder.setMinimumNumberShouldMatch(2);
|
|
|
+ innerBuilder.add(termQuery1, BooleanClause.Occur.SHOULD);
|
|
|
+ innerBuilder.add(termQuery2, BooleanClause.Occur.SHOULD);
|
|
|
+ builder.add(innerBuilder.build(), BooleanClause.Occur.MUST);
|
|
|
+ builder.add(termQuery3, BooleanClause.Occur.MUST);
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Verified, because m_s_m is specified in an inner clause and not top level clause", result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(3));
|
|
|
+ assertThat(result.extractions.size(), equalTo(3));
|
|
|
+ extractions = new ArrayList<>(result.extractions);
|
|
|
+ extractions.sort(Comparator.comparing(key -> key.term));
|
|
|
+ assertThat(extractions.get(0).term, equalTo(new Term("_field", "_term1")));
|
|
|
+ assertThat(extractions.get(1).term, equalTo(new Term("_field", "_term2")));
|
|
|
+ assertThat(extractions.get(2).term, equalTo(new Term("_field", "_term3")));
|
|
|
+
|
|
|
+ builder = new BooleanQuery.Builder();
|
|
|
+ builder.add(innerBuilder.build(), BooleanClause.Occur.SHOULD);
|
|
|
+ builder.add(termQuery3, BooleanClause.Occur.MUST);
|
|
|
+ result = analyze(builder.build(), Version.CURRENT);
|
|
|
+ assertThat("Verified, because m_s_m is specified in an inner clause and not top level clause", result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ assertThat(result.extractions.size(), equalTo(1));
|
|
|
+ extractions = new ArrayList<>(result.extractions);
|
|
|
+ assertThat(extractions.get(0).term, equalTo(new Term("_field", "_term3")));
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_constantScoreQuery() {
|
|
|
TermQuery termQuery1 = new TermQuery(new Term("_field", "_term"));
|
|
|
ConstantScoreQuery constantScoreQuery = new ConstantScoreQuery(termQuery1);
|
|
|
- Result result = analyze(constantScoreQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(constantScoreQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
assertThat(terms.size(), equalTo(1));
|
|
|
assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field()));
|
|
@@ -272,8 +403,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
public void testExtractQueryMetadata_boostQuery() {
|
|
|
TermQuery termQuery1 = new TermQuery(new Term("_field", "_term"));
|
|
|
BoostQuery constantScoreQuery = new BoostQuery(termQuery1, 1f);
|
|
|
- Result result = analyze(constantScoreQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(constantScoreQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
assertThat(terms.size(), equalTo(1));
|
|
|
assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field()));
|
|
@@ -284,11 +416,13 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
CommonTermsQuery commonTermsQuery = new CommonTermsQuery(BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, 100);
|
|
|
commonTermsQuery.add(new Term("_field", "_term1"));
|
|
|
commonTermsQuery.add(new Term("_field", "_term2"));
|
|
|
- Result result = analyze(commonTermsQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(commonTermsQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(2));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertThat(terms.get(0).field(), equalTo("_field"));
|
|
|
assertThat(terms.get(0).text(), equalTo("_term1"));
|
|
|
assertThat(terms.get(1).field(), equalTo("_field"));
|
|
@@ -298,8 +432,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
public void testExtractQueryMetadata_blendedTermQuery() {
|
|
|
Term[] termsArr = new Term[]{new Term("_field", "_term1"), new Term("_field", "_term2")};
|
|
|
BlendedTermQuery commonTermsQuery = BlendedTermQuery.dismaxBlendedQuery(termsArr, 1.0f);
|
|
|
- Result result = analyze(commonTermsQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(commonTermsQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryAnalyzer.QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(2));
|
|
@@ -322,8 +457,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
// 4) FieldMaskingSpanQuery is a tricky query so we shouldn't optimize this
|
|
|
|
|
|
SpanTermQuery spanTermQuery1 = new SpanTermQuery(new Term("_field", "_short_term"));
|
|
|
- Result result = analyze(spanTermQuery1, Collections.emptyMap());
|
|
|
+ Result result = analyze(spanTermQuery1, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, spanTermQuery1.getTerm());
|
|
|
}
|
|
|
|
|
@@ -333,8 +469,21 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
SpanNearQuery spanNearQuery = new SpanNearQuery.Builder("_field", true)
|
|
|
.addClause(spanTermQuery1).addClause(spanTermQuery2).build();
|
|
|
|
|
|
- Result result = analyze(spanNearQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(spanNearQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
+ assertTermsEqual(result.extractions, spanTermQuery1.getTerm(), spanTermQuery2.getTerm());
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testExtractQueryMetadata_spanNearQuery_pre6dot1() {
|
|
|
+ SpanTermQuery spanTermQuery1 = new SpanTermQuery(new Term("_field", "_short_term"));
|
|
|
+ SpanTermQuery spanTermQuery2 = new SpanTermQuery(new Term("_field", "_very_long_term"));
|
|
|
+ SpanNearQuery spanNearQuery = new SpanNearQuery.Builder("_field", true)
|
|
|
+ .addClause(spanTermQuery1).addClause(spanTermQuery2).build();
|
|
|
+
|
|
|
+ Result result = analyze(spanNearQuery, Version.V_6_0_0);
|
|
|
+ assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, spanTermQuery2.getTerm());
|
|
|
}
|
|
|
|
|
@@ -342,16 +491,18 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
SpanTermQuery spanTermQuery1 = new SpanTermQuery(new Term("_field", "_short_term"));
|
|
|
SpanTermQuery spanTermQuery2 = new SpanTermQuery(new Term("_field", "_very_long_term"));
|
|
|
SpanOrQuery spanOrQuery = new SpanOrQuery(spanTermQuery1, spanTermQuery2);
|
|
|
- Result result = analyze(spanOrQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(spanOrQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, spanTermQuery1.getTerm(), spanTermQuery2.getTerm());
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_spanFirstQuery() {
|
|
|
SpanTermQuery spanTermQuery1 = new SpanTermQuery(new Term("_field", "_short_term"));
|
|
|
SpanFirstQuery spanFirstQuery = new SpanFirstQuery(spanTermQuery1, 20);
|
|
|
- Result result = analyze(spanFirstQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(spanFirstQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, spanTermQuery1.getTerm());
|
|
|
}
|
|
|
|
|
@@ -359,47 +510,54 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
SpanTermQuery spanTermQuery1 = new SpanTermQuery(new Term("_field", "_short_term"));
|
|
|
SpanTermQuery spanTermQuery2 = new SpanTermQuery(new Term("_field", "_very_long_term"));
|
|
|
SpanNotQuery spanNotQuery = new SpanNotQuery(spanTermQuery1, spanTermQuery2);
|
|
|
- Result result = analyze(spanNotQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(spanNotQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, spanTermQuery1.getTerm());
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_matchNoDocsQuery() {
|
|
|
- Result result = analyze(new MatchNoDocsQuery("sometimes there is no reason at all"), Collections.emptyMap());
|
|
|
+ Result result = analyze(new MatchNoDocsQuery("sometimes there is no reason at all"), Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
assertEquals(0, result.extractions.size());
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
|
|
|
BooleanQuery.Builder bq = new BooleanQuery.Builder();
|
|
|
bq.add(new TermQuery(new Term("field", "value")), BooleanClause.Occur.MUST);
|
|
|
bq.add(new MatchNoDocsQuery("sometimes there is no reason at all"), BooleanClause.Occur.MUST);
|
|
|
- result = analyze(bq.build(), Collections.emptyMap());
|
|
|
- assertThat(result.verified, is(false));
|
|
|
- assertEquals(0, result.extractions.size());
|
|
|
+ result = analyze(bq.build(), Version.CURRENT);
|
|
|
+ assertThat(result.verified, is(true));
|
|
|
+ assertEquals(1, result.extractions.size());
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
+ assertTermsEqual(result.extractions, new Term("field", "value"));
|
|
|
|
|
|
bq = new BooleanQuery.Builder();
|
|
|
bq.add(new TermQuery(new Term("field", "value")), BooleanClause.Occur.SHOULD);
|
|
|
bq.add(new MatchNoDocsQuery("sometimes there is no reason at all"), BooleanClause.Occur.SHOULD);
|
|
|
- result = analyze(bq.build(), Collections.emptyMap());
|
|
|
+ result = analyze(bq.build(), Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, new Term("field", "value"));
|
|
|
|
|
|
DisjunctionMaxQuery disjunctionMaxQuery = new DisjunctionMaxQuery(
|
|
|
Arrays.asList(new TermQuery(new Term("field", "value")), new MatchNoDocsQuery("sometimes there is no reason at all")),
|
|
|
1f
|
|
|
);
|
|
|
- result = analyze(disjunctionMaxQuery, Collections.emptyMap());
|
|
|
+ result = analyze(disjunctionMaxQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, new Term("field", "value"));
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_matchAllDocsQuery() {
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(new MatchAllDocsQuery(), Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(new MatchAllDocsQuery(), Version.CURRENT));
|
|
|
|
|
|
BooleanQuery.Builder builder = new BooleanQuery.Builder();
|
|
|
builder.add(new TermQuery(new Term("field", "value")), BooleanClause.Occur.MUST);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
|
|
|
- Result result = analyze(builder.build(), Collections.emptyMap());
|
|
|
+ Result result = analyze(builder.build(), Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, new Term("field", "value"));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
@@ -407,40 +565,40 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
|
|
|
BooleanQuery bq1 = builder.build();
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(bq1, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(bq1, Version.CURRENT));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST_NOT);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
|
|
|
BooleanQuery bq2 = builder.build();
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(bq2, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(bq2, Version.CURRENT));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
|
|
|
BooleanQuery bq3 = builder.build();
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(bq3, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(bq3, Version.CURRENT));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST_NOT);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
|
|
|
BooleanQuery bq4 = builder.build();
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(bq4, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(bq4, Version.CURRENT));
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(new TermQuery(new Term("field", "value")), BooleanClause.Occur.SHOULD);
|
|
|
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.SHOULD);
|
|
|
BooleanQuery bq5 = builder.build();
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(bq5, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(bq5, Version.CURRENT));
|
|
|
}
|
|
|
|
|
|
public void testExtractQueryMetadata_unsupportedQuery() {
|
|
|
TermRangeQuery termRangeQuery = new TermRangeQuery("_field", null, null, true, false);
|
|
|
UnsupportedQueryException e = expectThrows(UnsupportedQueryException.class,
|
|
|
- () -> analyze(termRangeQuery, Collections.emptyMap()));
|
|
|
+ () -> analyze(termRangeQuery, Version.CURRENT));
|
|
|
assertThat(e.getUnsupportedQuery(), sameInstance(termRangeQuery));
|
|
|
|
|
|
TermQuery termQuery1 = new TermQuery(new Term("_field", "_term"));
|
|
@@ -449,7 +607,7 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(termRangeQuery, BooleanClause.Occur.SHOULD);
|
|
|
BooleanQuery bq = builder.build();
|
|
|
|
|
|
- e = expectThrows(UnsupportedQueryException.class, () -> analyze(bq, Collections.emptyMap()));
|
|
|
+ e = expectThrows(UnsupportedQueryException.class, () -> analyze(bq, Version.CURRENT));
|
|
|
assertThat(e.getUnsupportedQuery(), sameInstance(termRangeQuery));
|
|
|
}
|
|
|
|
|
@@ -462,8 +620,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(unsupportedQuery, BooleanClause.Occur.MUST);
|
|
|
BooleanQuery bq1 = builder.build();
|
|
|
|
|
|
- Result result = analyze(bq1, Collections.emptyMap());
|
|
|
+ Result result = analyze(bq1, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, termQuery1.getTerm());
|
|
|
|
|
|
TermQuery termQuery2 = new TermQuery(new Term("_field", "_longer_term"));
|
|
@@ -472,15 +631,16 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
builder.add(termQuery2, BooleanClause.Occur.MUST);
|
|
|
builder.add(unsupportedQuery, BooleanClause.Occur.MUST);
|
|
|
bq1 = builder.build();
|
|
|
- result = analyze(bq1, Collections.emptyMap());
|
|
|
+ result = analyze(bq1, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
- assertTermsEqual(result.extractions, termQuery2.getTerm());
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
+ assertTermsEqual(result.extractions, termQuery1.getTerm(), termQuery2.getTerm());
|
|
|
|
|
|
builder = new BooleanQuery.Builder();
|
|
|
builder.add(unsupportedQuery, BooleanClause.Occur.MUST);
|
|
|
builder.add(unsupportedQuery, BooleanClause.Occur.MUST);
|
|
|
BooleanQuery bq2 = builder.build();
|
|
|
- UnsupportedQueryException e = expectThrows(UnsupportedQueryException.class, () -> analyze(bq2, Collections.emptyMap()));
|
|
|
+ UnsupportedQueryException e = expectThrows(UnsupportedQueryException.class, () -> analyze(bq2, Version.CURRENT));
|
|
|
assertThat(e.getUnsupportedQuery(), sameInstance(unsupportedQuery));
|
|
|
}
|
|
|
|
|
@@ -493,8 +653,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
Arrays.asList(termQuery1, termQuery2, termQuery3, termQuery4), 0.1f
|
|
|
);
|
|
|
|
|
|
- Result result = analyze(disjunctionMaxQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(disjunctionMaxQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryAnalyzer.QueryExtraction> terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(4));
|
|
@@ -511,8 +672,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
Arrays.asList(termQuery1, termQuery2, termQuery3, new PhraseQuery("_field", "_term4")), 0.1f
|
|
|
);
|
|
|
|
|
|
- result = analyze(disjunctionMaxQuery, Collections.emptyMap());
|
|
|
+ result = analyze(disjunctionMaxQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
terms = new ArrayList<>(result.extractions);
|
|
|
terms.sort(Comparator.comparing(qt -> qt.term));
|
|
|
assertThat(terms.size(), equalTo(4));
|
|
@@ -528,148 +690,91 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
public void testSynonymQuery() {
|
|
|
SynonymQuery query = new SynonymQuery();
|
|
|
- Result result = analyze(query, Collections.emptyMap());
|
|
|
+ Result result = analyze(query, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertThat(result.extractions.isEmpty(), is(true));
|
|
|
|
|
|
query = new SynonymQuery(new Term("_field", "_value1"), new Term("_field", "_value2"));
|
|
|
- result = analyze(query, Collections.emptyMap());
|
|
|
+ result = analyze(query, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, new Term("_field", "_value1"), new Term("_field", "_value2"));
|
|
|
}
|
|
|
|
|
|
public void testFunctionScoreQuery() {
|
|
|
TermQuery termQuery = new TermQuery(new Term("_field", "_value"));
|
|
|
FunctionScoreQuery functionScoreQuery = new FunctionScoreQuery(termQuery, new RandomScoreFunction(0, 0, null));
|
|
|
- Result result = analyze(functionScoreQuery, Collections.emptyMap());
|
|
|
+ Result result = analyze(functionScoreQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(true));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, new Term("_field", "_value"));
|
|
|
|
|
|
functionScoreQuery = new FunctionScoreQuery(termQuery, new RandomScoreFunction(0, 0, null),
|
|
|
CombineFunction.MULTIPLY, 1f, 10f);
|
|
|
- result = analyze(functionScoreQuery, Collections.emptyMap());
|
|
|
+ result = analyze(functionScoreQuery, Version.CURRENT);
|
|
|
assertThat(result.verified, is(false));
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertTermsEqual(result.extractions, new Term("_field", "_value"));
|
|
|
}
|
|
|
|
|
|
public void testSelectBestExtraction() {
|
|
|
Set<QueryExtraction> queryTerms1 = terms(new int[0], "12", "1234", "12345");
|
|
|
Set<QueryAnalyzer.QueryExtraction> queryTerms2 = terms(new int[0], "123", "1234", "12345");
|
|
|
- Set<QueryExtraction> result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ Set<QueryExtraction> result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms2, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{1, 2, 3});
|
|
|
queryTerms2 = terms(new int[]{2, 3, 4});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms1, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{4, 5, 6});
|
|
|
queryTerms2 = terms(new int[]{1, 2, 3});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms2, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{1, 2, 3}, "123", "456");
|
|
|
queryTerms2 = terms(new int[]{2, 3, 4}, "123", "456");
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms1, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{10});
|
|
|
queryTerms2 = terms(new int[]{1});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms2, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{10}, "123");
|
|
|
queryTerms2 = terms(new int[]{1});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms1, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{10}, "1", "123");
|
|
|
queryTerms2 = terms(new int[]{1}, "1", "2");
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame(queryTerms1, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{1, 2, 3}, "123", "456");
|
|
|
queryTerms2 = terms(new int[]{2, 3, 4}, "1", "456");
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame("Ignoring ranges, so then prefer queryTerms1, because it has the longest shortest term", queryTerms1, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{});
|
|
|
queryTerms2 = terms(new int[]{});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame("In case query extractions are empty", queryTerms2, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{1});
|
|
|
queryTerms2 = terms(new int[]{});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame("In case query a single extraction is empty", queryTerms1, result);
|
|
|
|
|
|
queryTerms1 = terms(new int[]{});
|
|
|
queryTerms2 = terms(new int[]{1});
|
|
|
- result = selectBestExtraction(Collections.emptyMap(), queryTerms1, queryTerms2);
|
|
|
+ result = selectBestExtraction(queryTerms1, queryTerms2);
|
|
|
assertSame("In case query a single extraction is empty", queryTerms2, result);
|
|
|
}
|
|
|
|
|
|
- public void testSelectBestExtraction_boostFields() {
|
|
|
- Set<QueryExtraction> queryTerms1 = new HashSet<>(Arrays.asList(
|
|
|
- new QueryExtraction(new Term("status_field", "sold")),
|
|
|
- new QueryExtraction(new Term("category", "accessory"))
|
|
|
- ));
|
|
|
- Set<QueryAnalyzer.QueryExtraction> queryTerms2 = new HashSet<>(Arrays.asList(
|
|
|
- new QueryExtraction(new Term("status_field", "instock")),
|
|
|
- new QueryExtraction(new Term("category", "hardware"))
|
|
|
- ));
|
|
|
- Set<QueryExtraction> result = selectBestExtraction(Collections.singletonMap("status_field", 0F), queryTerms1, queryTerms2);
|
|
|
- assertSame(queryTerms1, result);
|
|
|
-
|
|
|
- byte[] interval = new byte[Long.BYTES];
|
|
|
- LongPoint.encodeDimension(4, interval, 0);
|
|
|
- queryTerms1 = new HashSet<>(Arrays.asList(
|
|
|
- new QueryExtraction(new Term("status_field", "sold")),
|
|
|
- new QueryExtraction(new QueryAnalyzer.Range("price", null, null, interval))
|
|
|
- ));
|
|
|
- interval = new byte[Long.BYTES];
|
|
|
- LongPoint.encodeDimension(8, interval, 0);
|
|
|
- queryTerms2 = new HashSet<>(Arrays.asList(
|
|
|
- new QueryExtraction(new Term("status_field", "instock")),
|
|
|
- new QueryExtraction(new QueryAnalyzer.Range("price", null, null, interval))
|
|
|
- ));
|
|
|
- result = selectBestExtraction(Collections.singletonMap("status_field", 0F), queryTerms1, queryTerms2);
|
|
|
- assertSame(queryTerms1, result);
|
|
|
-
|
|
|
- Map<String, Float> boostFields = new HashMap<>();
|
|
|
- boostFields.put("field1", 2F);
|
|
|
- boostFields.put("field2", 0.5F);
|
|
|
- boostFields.put("field4", 3F);
|
|
|
- boostFields.put("field5", 0.6F);
|
|
|
- queryTerms1 = new HashSet<>(Arrays.asList(
|
|
|
- new QueryExtraction(new Term("field1", "sold")),
|
|
|
- new QueryExtraction(new Term("field2", "accessory")),
|
|
|
- new QueryExtraction(new QueryAnalyzer.Range("field3", null, null, new byte[0]))
|
|
|
- ));
|
|
|
- queryTerms2 = new HashSet<>(Arrays.asList(
|
|
|
- new QueryExtraction(new Term("field3", "sold")),
|
|
|
- new QueryExtraction(new Term("field4", "accessory")),
|
|
|
- new QueryExtraction(new QueryAnalyzer.Range("field5", null, null, new byte[0]))
|
|
|
- ));
|
|
|
- result = selectBestExtraction(boostFields, queryTerms1, queryTerms2);
|
|
|
- assertSame(queryTerms2, result);
|
|
|
-
|
|
|
- boostFields.put("field2", 6F);
|
|
|
- result = selectBestExtraction(boostFields, queryTerms1, queryTerms2);
|
|
|
- assertSame(queryTerms1, result);
|
|
|
-
|
|
|
- boostFields.put("field2", 0F);
|
|
|
- boostFields.put("field3", 0F);
|
|
|
- boostFields.put("field5", 0F);
|
|
|
- result = selectBestExtraction(boostFields, queryTerms1, queryTerms2);
|
|
|
- assertSame(queryTerms2, result);
|
|
|
-
|
|
|
- boostFields = new HashMap<>();
|
|
|
- boostFields.put("field2", 2F);
|
|
|
- result = selectBestExtraction(boostFields, queryTerms1, queryTerms2);
|
|
|
- assertSame(queryTerms1, result);
|
|
|
- }
|
|
|
-
|
|
|
public void testSelectBestExtraction_random() {
|
|
|
Set<QueryExtraction> terms1 = new HashSet<>();
|
|
|
int shortestTerms1Length = Integer.MAX_VALUE;
|
|
@@ -691,7 +796,7 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
sumTermLength -= length;
|
|
|
}
|
|
|
|
|
|
- Set<QueryAnalyzer.QueryExtraction> result = selectBestExtraction(Collections.emptyMap(), terms1, terms2);
|
|
|
+ Set<QueryAnalyzer.QueryExtraction> result = selectBestExtraction(terms1, terms2);
|
|
|
Set<QueryExtraction> expected = shortestTerms1Length >= shortestTerms2Length ? terms1 : terms2;
|
|
|
assertThat(result, sameInstance(expected));
|
|
|
}
|
|
@@ -699,8 +804,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
public void testPointRangeQuery() {
|
|
|
// int ranges get converted to long ranges:
|
|
|
Query query = IntPoint.newRangeQuery("_field", 10, 20);
|
|
|
- Result result = analyze(query, Collections.emptyMap());
|
|
|
+ Result result = analyze(query, Version.CURRENT);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryAnalyzer.QueryExtraction> ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
|
assertNull(ranges.get(0).term);
|
|
@@ -709,7 +815,8 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
assertDimension(ranges.get(0).range.upperPoint, bytes -> IntPoint.encodeDimension(20, bytes, 0));
|
|
|
|
|
|
query = LongPoint.newRangeQuery("_field", 10L, 21L);
|
|
|
- result = analyze(query, Collections.emptyMap());
|
|
|
+ result = analyze(query, Version.CURRENT);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertFalse(result.verified);
|
|
|
ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
@@ -720,7 +827,8 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
// Half float ranges get converted to double ranges:
|
|
|
query = HalfFloatPoint.newRangeQuery("_field", 10F, 20F);
|
|
|
- result = analyze(query, Collections.emptyMap());
|
|
|
+ result = analyze(query, Version.CURRENT);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertFalse(result.verified);
|
|
|
ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
@@ -731,7 +839,8 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
// Float ranges get converted to double ranges:
|
|
|
query = FloatPoint.newRangeQuery("_field", 10F, 20F);
|
|
|
- result = analyze(query, Collections.emptyMap());
|
|
|
+ result = analyze(query, Version.CURRENT);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertFalse(result.verified);
|
|
|
ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
@@ -741,7 +850,8 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
assertDimension(ranges.get(0).range.upperPoint, bytes -> FloatPoint.encodeDimension(20F, bytes, 0));
|
|
|
|
|
|
query = DoublePoint.newRangeQuery("_field", 10D, 20D);
|
|
|
- result = analyze(query, Collections.emptyMap());
|
|
|
+ result = analyze(query, Version.CURRENT);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertFalse(result.verified);
|
|
|
ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
@@ -752,7 +862,8 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
|
|
|
query = InetAddressPoint.newRangeQuery("_field", InetAddresses.forString("192.168.1.0"),
|
|
|
InetAddresses.forString("192.168.1.255"));
|
|
|
- result = analyze(query, Collections.emptyMap());
|
|
|
+ result = analyze(query, Version.CURRENT);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertFalse(result.verified);
|
|
|
ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
@@ -765,24 +876,26 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
public void testTooManyPointDimensions() {
|
|
|
// For now no extraction support for geo queries:
|
|
|
Query query1 = LatLonPoint.newBoxQuery("_field", 0, 1, 0, 1);
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(query1, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(query1, Version.CURRENT));
|
|
|
|
|
|
Query query2 = LongPoint.newRangeQuery("_field", new long[]{0, 0, 0}, new long[]{1, 1, 1});
|
|
|
- expectThrows(UnsupportedQueryException.class, () -> analyze(query2, Collections.emptyMap()));
|
|
|
+ expectThrows(UnsupportedQueryException.class, () -> analyze(query2, Version.CURRENT));
|
|
|
}
|
|
|
|
|
|
public void testPointRangeQuery_lowerUpperReversed() {
|
|
|
Query query = IntPoint.newRangeQuery("_field", 20, 10);
|
|
|
- Result result = analyze(query, Collections.emptyMap());
|
|
|
+ Result result = analyze(query, Version.CURRENT);
|
|
|
assertTrue(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertThat(result.extractions.size(), equalTo(0));
|
|
|
}
|
|
|
|
|
|
public void testIndexOrDocValuesQuery() {
|
|
|
Query query = new IndexOrDocValuesQuery(IntPoint.newRangeQuery("_field", 10, 20),
|
|
|
SortedNumericDocValuesField.newSlowRangeQuery("_field", 10, 20));
|
|
|
- Result result = analyze(query, Collections.emptyMap());
|
|
|
+ Result result = analyze(query, Version.CURRENT);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
List<QueryAnalyzer.QueryExtraction> ranges = new ArrayList<>(result.extractions);
|
|
|
assertThat(ranges.size(), equalTo(1));
|
|
|
assertNull(ranges.get(0).term);
|
|
@@ -795,8 +908,9 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
TermQuery termQuery = new TermQuery(new Term("field", "value"));
|
|
|
QueryBitSetProducer queryBitSetProducer = new QueryBitSetProducer(new TermQuery(new Term("_type", "child")));
|
|
|
ESToParentBlockJoinQuery query = new ESToParentBlockJoinQuery(termQuery, queryBitSetProducer, ScoreMode.None, "child");
|
|
|
- Result result = analyze(query, Collections.emptyMap());
|
|
|
+ Result result = analyze(query, Version.CURRENT);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertEquals(1, result.extractions.size());
|
|
|
assertNull(result.extractions.toArray(new QueryExtraction[0])[0].range);
|
|
|
assertEquals(new Term("field", "value"), result.extractions.toArray(new QueryExtraction[0])[0].term);
|
|
@@ -806,44 +920,101 @@ public class QueryAnalyzerTests extends ESTestCase {
|
|
|
BooleanQuery.Builder boolQuery = new BooleanQuery.Builder();
|
|
|
boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
boolQuery.add(LongPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
- Result result = analyze(boolQuery.build(), Collections.emptyMap());
|
|
|
+ Result result = analyze(boolQuery.build(), Version.V_6_0_0);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertEquals(1, result.extractions.size());
|
|
|
assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
|
|
|
boolQuery = new BooleanQuery.Builder();
|
|
|
boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
boolQuery.add(IntPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
- result = analyze(boolQuery.build(), Collections.emptyMap());
|
|
|
+ result = analyze(boolQuery.build(), Version.V_6_0_0);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertEquals(1, result.extractions.size());
|
|
|
assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
|
|
|
boolQuery = new BooleanQuery.Builder();
|
|
|
boolQuery.add(DoublePoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
boolQuery.add(DoublePoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
- result = analyze(boolQuery.build(), Collections.emptyMap());
|
|
|
+ result = analyze(boolQuery.build(), Version.V_6_0_0);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertEquals(1, result.extractions.size());
|
|
|
assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
|
|
|
boolQuery = new BooleanQuery.Builder();
|
|
|
boolQuery.add(DoublePoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
boolQuery.add(FloatPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
- result = analyze(boolQuery.build(), Collections.emptyMap());
|
|
|
+ result = analyze(boolQuery.build(), Version.V_6_0_0);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertEquals(1, result.extractions.size());
|
|
|
assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
|
|
|
boolQuery = new BooleanQuery.Builder();
|
|
|
boolQuery.add(HalfFloatPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
boolQuery.add(HalfFloatPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
- result = analyze(boolQuery.build(), Collections.emptyMap());
|
|
|
+ result = analyze(boolQuery.build(), Version.V_6_0_0);
|
|
|
assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
assertEquals(1, result.extractions.size());
|
|
|
assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
}
|
|
|
|
|
|
+ public void testPointRangeQuerySelectRanges() {
|
|
|
+ BooleanQuery.Builder boolQuery = new BooleanQuery.Builder();
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.SHOULD);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.SHOULD);
|
|
|
+ Result result = analyze(boolQuery.build(), Version.CURRENT);
|
|
|
+ assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ assertEquals(2, result.extractions.size());
|
|
|
+ assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(1).range.fieldName);
|
|
|
+
|
|
|
+ boolQuery = new BooleanQuery.Builder();
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
+ result = analyze(boolQuery.build(), Version.CURRENT);
|
|
|
+ assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
+ assertEquals(2, result.extractions.size());
|
|
|
+ assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(1).range.fieldName);
|
|
|
+
|
|
|
+ boolQuery = new BooleanQuery.Builder();
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 15), BooleanClause.Occur.FILTER);
|
|
|
+ result = analyze(boolQuery.build(), Version.CURRENT);
|
|
|
+ assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ assertEquals(2, result.extractions.size());
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(1).range.fieldName);
|
|
|
+
|
|
|
+ boolQuery = new BooleanQuery.Builder().setMinimumNumberShouldMatch(2);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.SHOULD);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field2", 10, 15), BooleanClause.Occur.SHOULD);
|
|
|
+ result = analyze(boolQuery.build(), Version.CURRENT);
|
|
|
+ assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(2));
|
|
|
+ assertEquals(2, result.extractions.size());
|
|
|
+ assertEquals("_field2", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(1).range.fieldName);
|
|
|
+
|
|
|
+ boolQuery = new BooleanQuery.Builder().setMinimumNumberShouldMatch(2);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.SHOULD);
|
|
|
+ boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 15), BooleanClause.Occur.SHOULD);
|
|
|
+ result = analyze(boolQuery.build(), Version.CURRENT);
|
|
|
+ assertFalse(result.verified);
|
|
|
+ assertThat(result.minimumShouldMatch, equalTo(1));
|
|
|
+ assertEquals(2, result.extractions.size());
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(0).range.fieldName);
|
|
|
+ assertEquals("_field1", new ArrayList<>(result.extractions).get(1).range.fieldName);
|
|
|
+ }
|
|
|
+
|
|
|
private static void assertDimension(byte[] expected, Consumer<byte[]> consumer) {
|
|
|
byte[] dest = new byte[expected.length];
|
|
|
consumer.accept(dest);
|