From 39e6da0e204548520a829928d63a231a4fef1cd1 Mon Sep 17 00:00:00 2001 From: "Eric B. Ridge" Date: Mon, 20 Jun 2016 00:26:48 -0600 Subject: [PATCH] fix terrible bug where ANDed terms + phrases against the same field would be rewritten as ORs! --- .../query_parser/TermAnalyzerOptimizer.java | 20 +++++-- .../query_parser/TestQueryRewriter.java | 17 +++++- .../query_parser/testComplexQueryAST.expected | 60 +++++++++---------- .../testComplexQueryJson.expected | 60 +++++++++---------- 4 files changed, 89 insertions(+), 68 deletions(-) diff --git a/elasticsearch/src/main/java/com/tcdi/zombodb/query_parser/TermAnalyzerOptimizer.java b/elasticsearch/src/main/java/com/tcdi/zombodb/query_parser/TermAnalyzerOptimizer.java index 00a36b835..405914f92 100644 --- a/elasticsearch/src/main/java/com/tcdi/zombodb/query_parser/TermAnalyzerOptimizer.java +++ b/elasticsearch/src/main/java/com/tcdi/zombodb/query_parser/TermAnalyzerOptimizer.java @@ -92,13 +92,23 @@ private void pullOutComplexTokensFromArrays(QueryParserNode root) { } if (!complex.isEmpty()) { root.renumber(); - ASTOr or = new ASTOr(QueryParserTreeConstants.JJTOR); - for (QueryParserNode node : complex) - or.jjtAddChild(node, or.jjtGetNumChildren()); - ((QueryParserNode) root.parent).replaceChild(root, or); + QueryParserNode newNode; + + if (((ASTArray) root).isAnd()) { + ASTAnd and = new ASTAnd(QueryParserTreeConstants.JJTAND); + for (QueryParserNode node : complex) + and.jjtAddChild(node, and.jjtGetNumChildren()); + newNode = and; + } else { + ASTOr or = new ASTOr(QueryParserTreeConstants.JJTOR); + for (QueryParserNode node : complex) + or.jjtAddChild(node, or.jjtGetNumChildren()); + newNode = or; + } + ((QueryParserNode) root.parent).replaceChild(root, newNode); if (root.jjtGetNumChildren() > 0) - or.jjtAddChild(root, or.jjtGetNumChildren()); + newNode.jjtAddChild(root, newNode.jjtGetNumChildren()); } } else { for (QueryParserNode child : root) diff --git a/elasticsearch/src/test/java/com/tcdi/zombodb/query_parser/TestQueryRewriter.java b/elasticsearch/src/test/java/com/tcdi/zombodb/query_parser/TestQueryRewriter.java index fe45fb557..e8e62ec34 100644 --- a/elasticsearch/src/test/java/com/tcdi/zombodb/query_parser/TestQueryRewriter.java +++ b/elasticsearch/src/test/java/com/tcdi/zombodb/query_parser/TestQueryRewriter.java @@ -3056,7 +3056,7 @@ public void testIssue_20_ValidateParsing() throws Exception { " \"bool\" : {\n" + " \"must\" : [ {\n" + " \"bool\" : {\n" + - " \"should\" : [ {\n" + + " \"must\" : [ {\n" + " \"wildcard\" : {\n" + " \"exact_field\" : \"phrase with *wildcard*\"\n" + " }\n" + @@ -3084,7 +3084,7 @@ public void testIssue_20_ValidateParsing() throws Exception { " }\n" + " }, {\n" + " \"bool\" : {\n" + - " \"should\" : [ {\n" + + " \"must\" : [ {\n" + " \"match\" : {\n" + " \"phrase_field\" : {\n" + " \"query\" : \"phrase value\",\n" + @@ -3378,7 +3378,7 @@ public void testRandomStringsJson() throws Exception { assertJson("phrase_field:(asdflkj234-132asdfuj asiodfja;sdf #487adqerydfskf0230 &@#$23)", "{\n" + " \"bool\" : {\n" + - " \"should\" : [ {\n" + + " \"must\" : [ {\n" + " \"match\" : {\n" + " \"phrase_field\" : {\n" + " \"query\" : \"asdflkj234-132asdfuj\",\n" + @@ -4724,5 +4724,16 @@ public void testRegexProximityWithAPhrase() throws Exception { ); } + @Test + public void testComplexTokenPulloutWithAND() throws Exception { + assertAST("english_field:(\"I''ll see you later\" and darling)", + "QueryTree\n" + + " Expansion\n" + + " id=id\n" + + " And\n" + + " Phrase (fieldname=english_field, operator=CONTAINS, value=I''ll see you later, index=db.schema.table.index)\n" + + " Array (fieldname=english_field, operator=CONTAINS, index=db.schema.table.index) (AND)\n" + + " Word (fieldname=english_field, operator=CONTAINS, value=darl, index=db.schema.table.index)"); + } } diff --git a/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryAST.expected b/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryAST.expected index 74b6c1129..17245fa7b 100644 --- a/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryAST.expected +++ b/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryAST.expected @@ -64,7 +64,7 @@ QueryTree Expansion id=id Or - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=fulltext_field, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=fulltext_field, operator=CONTAINS, value=prefix) @@ -83,7 +83,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=_all, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=_all, operator=CONTAINS, value=prefix) @@ -102,7 +102,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=fulltext_field, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=fulltext_field, operator=CONTAINS, value=prefix) @@ -121,7 +121,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=_all, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=_all, operator=CONTAINS, value=prefix) @@ -140,7 +140,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=fulltext_field, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=fulltext_field, operator=CONTAINS, value=prefix) @@ -159,7 +159,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=_all, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=_all, operator=CONTAINS, value=prefix) @@ -178,7 +178,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=fulltext_field, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=fulltext_field, operator=CONTAINS, value=prefix) @@ -197,7 +197,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=_all, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=_all, operator=CONTAINS, value=prefix) @@ -222,7 +222,7 @@ QueryTree IndexName (value=db.schema.table.index) RightField (value=right) Or - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=fulltext_field, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=fulltext_field, operator=CONTAINS, value=prefix) @@ -241,7 +241,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=other, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=query, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=1-2, index=db.schema.table.index) Proximity (fieldname=_all, operator=CONTAINS, index=db.schema.table.index) Prefix (fieldname=_all, operator=CONTAINS, value=prefix) @@ -538,7 +538,7 @@ QueryTree Expansion id=id Or - Or + And Proximity (fieldname=fulltext_field, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=this) Word (fieldname=fulltext_field, operator=CONTAINS, value=is) @@ -553,7 +553,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=unordered) Word (fieldname=fulltext_field, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=fulltext_field, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=_all, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=this) Word (fieldname=_all, operator=CONTAINS, value=is) @@ -568,7 +568,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=unordered) Word (fieldname=_all, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=_all, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=fulltext_field, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=this) Word (fieldname=fulltext_field, operator=CONTAINS, value=is) @@ -583,7 +583,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=unordered) Word (fieldname=fulltext_field, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=fulltext_field, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=_all, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=this) Word (fieldname=_all, operator=CONTAINS, value=is) @@ -598,7 +598,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=unordered) Word (fieldname=_all, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=_all, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=fulltext_field, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=this) Word (fieldname=fulltext_field, operator=CONTAINS, value=is) @@ -613,7 +613,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=unordered) Word (fieldname=fulltext_field, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=fulltext_field, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=_all, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=this) Word (fieldname=_all, operator=CONTAINS, value=is) @@ -628,7 +628,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=unordered) Word (fieldname=_all, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=_all, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=fulltext_field, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=this) Word (fieldname=fulltext_field, operator=CONTAINS, value=is) @@ -643,7 +643,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=unordered) Word (fieldname=fulltext_field, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=fulltext_field, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=_all, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=this) Word (fieldname=_all, operator=CONTAINS, value=is) @@ -664,7 +664,7 @@ QueryTree IndexName (value=db.schema.table.index) RightField (value=right) Or - Or + And Proximity (fieldname=fulltext_field, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=this) Word (fieldname=fulltext_field, operator=CONTAINS, value=is) @@ -679,7 +679,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=unordered) Word (fieldname=fulltext_field, operator=CONTAINS, value=sloppy) Fuzzy (fieldname=fulltext_field, operator=CONTAINS, value=phrase) - Or + And Proximity (fieldname=_all, operator=CONTAINS, distance=11, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=this) Word (fieldname=_all, operator=CONTAINS, value=is) @@ -1005,7 +1005,7 @@ QueryTree Expansion id=id Or - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1016,7 +1016,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1027,7 +1027,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1038,7 +1038,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1049,7 +1049,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1060,7 +1060,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1071,7 +1071,7 @@ QueryTree Word (fieldname=_all, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=_all, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1082,7 +1082,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1099,7 +1099,7 @@ QueryTree IndexName (value=db.schema.table.index) RightField (value=right) Or - Or + And Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=fulltext_field, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) @@ -1110,7 +1110,7 @@ QueryTree Word (fieldname=fulltext_field, operator=CONTAINS, value=a, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=to, index=db.schema.table.index) Word (fieldname=fulltext_field, operator=CONTAINS, value=z, index=db.schema.table.index) - Or + And Phrase (fieldname=_all, operator=CONTAINS, value=a\-b\-c\-d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=a\/b\/c\/d, index=db.schema.table.index) Phrase (fieldname=_all, operator=CONTAINS, value=http\:\/\/www\.tcdi\.com\/\?id\=42, index=db.schema.table.index) diff --git a/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryJson.expected b/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryJson.expected index e9c07ff5d..a4814c3c0 100644 --- a/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryJson.expected +++ b/elasticsearch/src/test/resources/com/tcdi/zombodb/query_parser/testComplexQueryJson.expected @@ -60,7 +60,7 @@ "bool" : { "should" : [ { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "1-2", @@ -122,7 +122,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "1-2", @@ -184,7 +184,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "1-2", @@ -246,7 +246,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "1-2", @@ -308,7 +308,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "1-2", @@ -370,7 +370,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "1-2", @@ -432,7 +432,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "1-2", @@ -494,7 +494,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "1-2", @@ -560,7 +560,7 @@ "bool" : { "should" : [ { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "1-2", @@ -622,7 +622,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "1-2", @@ -1312,7 +1312,7 @@ "bool" : { "should" : [ { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -1412,7 +1412,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -1512,7 +1512,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -1612,7 +1612,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -1712,7 +1712,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -1812,7 +1812,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -1912,7 +1912,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -2012,7 +2012,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -2116,7 +2116,7 @@ "bool" : { "should" : [ { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -2216,7 +2216,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "span_near" : { "clauses" : [ { "span_term" : { @@ -3141,7 +3141,7 @@ "bool" : { "should" : [ { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "a-b-c-d", @@ -3171,7 +3171,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "a-b-c-d", @@ -3201,7 +3201,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "a-b-c-d", @@ -3231,7 +3231,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "a-b-c-d", @@ -3261,7 +3261,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "a-b-c-d", @@ -3291,7 +3291,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "a-b-c-d", @@ -3321,7 +3321,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "a-b-c-d", @@ -3351,7 +3351,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "a-b-c-d", @@ -3385,7 +3385,7 @@ "bool" : { "should" : [ { "bool" : { - "should" : [ { + "must" : [ { "match" : { "fulltext_field" : { "query" : "a-b-c-d", @@ -3415,7 +3415,7 @@ } }, { "bool" : { - "should" : [ { + "must" : [ { "match" : { "_all" : { "query" : "a-b-c-d",