Skip to content

Commit 4f91152

Browse files
committed
change numeric term or query parser field query to use range filter/query and not encoded Term query
1 parent cb8faaa commit 4f91152

File tree

9 files changed

+92
-55
lines changed

9 files changed

+92
-55
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,15 @@ public String fullName() {
162162
String indexedValue(T value);
163163

164164
/**
165-
* Should the field query {@link #termQuery(String)} be used when detecting this
165+
* Should the field query {@link #fieldQuery(String)} be used when detecting this
166166
* field in query string.
167167
*/
168-
boolean useTermQueryWithQueryString();
168+
boolean useFieldQueryWithQueryString();
169169

170170
/**
171171
* A field query for the specified value.
172172
*/
173-
Query termQuery(String value);
173+
Query fieldQuery(String value);
174174

175175
/**
176176
* A term query to use when parsing a query string. Can return <tt>null</tt>.

modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonAllFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public boolean enabled() {
110110
return new AllTermQuery(term);
111111
}
112112

113-
@Override public Query termQuery(String value) {
113+
@Override public Query fieldQuery(String value) {
114114
return new AllTermQuery(new Term(names.indexName(), value));
115115
}
116116

modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonFieldMapper.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -319,18 +319,18 @@ protected JsonFieldMapper(Names names, Field.Index index, Field.Store store, Fie
319319
return value.toString();
320320
}
321321

322-
@Override public boolean useTermQueryWithQueryString() {
323-
return false;
322+
@Override public Query queryStringTermQuery(Term term) {
323+
return null;
324324
}
325325

326-
@Override public Query termQuery(String value) {
327-
return new TermQuery(new Term(names.indexName(), indexedValue(value)));
326+
@Override public boolean useFieldQueryWithQueryString() {
327+
return false;
328328
}
329329

330-
@Override public Query queryStringTermQuery(Term term) {
331-
return null;
330+
@Override public Query fieldQuery(String value) {
331+
return new TermQuery(new Term(names.indexName(), indexedValue(value)));
332332
}
333-
333+
334334
@Override public Filter fieldFilter(String value) {
335335
return new TermFilter(new Term(names.indexName(), indexedValue(value)));
336336
}

modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonNumberFieldMapper.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.apache.lucene.analysis.TokenStream;
2424
import org.apache.lucene.document.Field;
2525
import org.apache.lucene.document.Fieldable;
26+
import org.apache.lucene.search.Filter;
27+
import org.apache.lucene.search.Query;
2628
import org.apache.lucene.util.NumericUtils;
2729
import org.elasticsearch.index.analysis.NamedAnalyzer;
2830
import org.elasticsearch.util.ThreadLocals;
@@ -115,10 +117,30 @@ public int precisionStep() {
115117
/**
116118
* Use the field query created here when matching on numbers.
117119
*/
118-
@Override public boolean useTermQueryWithQueryString() {
120+
@Override public boolean useFieldQueryWithQueryString() {
119121
return true;
120122
}
121123

124+
/**
125+
* Numeric field level query are basically range queries with same value and included. That's the recommended
126+
* way to execute it.
127+
*/
128+
@Override public Query fieldQuery(String value) {
129+
return rangeQuery(value, value, true, true);
130+
}
131+
132+
/**
133+
* Numeric field level filter are basically range queries with same value and included. That's the recommended
134+
* way to execute it.
135+
*/
136+
@Override public Filter fieldFilter(String value) {
137+
return rangeFilter(value, value, true, true);
138+
}
139+
140+
@Override public abstract Query rangeQuery(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
141+
142+
@Override public abstract Filter rangeFilter(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
143+
122144
/**
123145
* Override the default behavior (to return the string, and return the actual Number instance).
124146
*/

modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/TermJsonQueryParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public class TermJsonQueryParser extends AbstractIndexComponent implements JsonQ
9393
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
9494
if (smartNameFieldMappers != null) {
9595
if (smartNameFieldMappers.hasMapper()) {
96-
query = smartNameFieldMappers.mapper().termQuery(value);
96+
query = smartNameFieldMappers.mapper().fieldQuery(value);
9797
}
9898
}
9999
if (query == null) {

modules/elasticsearch/src/main/java/org/elasticsearch/index/query/support/MapperQueryParser.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,11 @@ public MapperQueryParser(String defaultField, Analyzer analyzer,
8181
if (fieldMappers != null) {
8282
currentMapper = fieldMappers.fieldMappers().mapper();
8383
if (currentMapper != null) {
84-
Query query;
85-
if (currentMapper.useTermQueryWithQueryString()) {
86-
query = currentMapper.termQuery(queryText);
87-
} else {
84+
Query query = null;
85+
if (currentMapper.useFieldQueryWithQueryString()) {
86+
query = currentMapper.fieldQuery(queryText);
87+
}
88+
if (query == null) {
8889
query = super.getFieldQuery(currentMapper.names().indexName(), queryText);
8990
}
9091
return wrapSmartNameQuery(query, fieldMappers, indexCache);

modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/SimpleJsonIndexQueryParserTests.java

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public class SimpleJsonIndexQueryParserTests {
158158

159159
@Test public void testDisMaxBuilder() throws Exception {
160160
IndexQueryParser queryParser = newQueryParser();
161-
Query parsedQuery = queryParser.parse(disMaxQuery().boost(1.2f).tieBreaker(0.7f).add(termQuery("age", 34)).add(termQuery("age", 35)));
161+
Query parsedQuery = queryParser.parse(disMaxQuery().boost(1.2f).tieBreaker(0.7f).add(termQuery("name.first", "first")).add(termQuery("name.last", "last")));
162162
assertThat(parsedQuery, instanceOf(DisjunctionMaxQuery.class));
163163
DisjunctionMaxQuery disjunctionMaxQuery = (DisjunctionMaxQuery) parsedQuery;
164164
assertThat((double) disjunctionMaxQuery.getBoost(), closeTo(1.2, 0.01));
@@ -168,11 +168,11 @@ public class SimpleJsonIndexQueryParserTests {
168168

169169
Query firstQ = disjuncts.get(0);
170170
assertThat(firstQ, instanceOf(TermQuery.class));
171-
assertThat(((TermQuery) firstQ).getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
171+
assertThat(((TermQuery) firstQ).getTerm(), equalTo(new Term("name.first", "first")));
172172

173173
Query secondsQ = disjuncts.get(1);
174174
assertThat(secondsQ, instanceOf(TermQuery.class));
175-
assertThat(((TermQuery) secondsQ).getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(35))));
175+
assertThat(((TermQuery) secondsQ).getTerm(), equalTo(new Term("name.last", "last")));
176176
}
177177

178178
@Test public void testDisMax() throws Exception {
@@ -188,49 +188,57 @@ public class SimpleJsonIndexQueryParserTests {
188188

189189
Query firstQ = disjuncts.get(0);
190190
assertThat(firstQ, instanceOf(TermQuery.class));
191-
assertThat(((TermQuery) firstQ).getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
191+
assertThat(((TermQuery) firstQ).getTerm(), equalTo(new Term("name.first", "first")));
192192

193193
Query secondsQ = disjuncts.get(1);
194194
assertThat(secondsQ, instanceOf(TermQuery.class));
195-
assertThat(((TermQuery) secondsQ).getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(35))));
195+
assertThat(((TermQuery) secondsQ).getTerm(), equalTo(new Term("name.last", "last")));
196196
}
197197

198198
@Test public void testTermQueryBuilder() throws IOException {
199199
IndexQueryParser queryParser = newQueryParser();
200200
Query parsedQuery = queryParser.parse(termQuery("age", 34).buildAsBytes());
201-
assertThat(parsedQuery, instanceOf(TermQuery.class));
202-
TermQuery termQuery = (TermQuery) parsedQuery;
203-
// since age is automatically registered in data, we encode it as numeric
204-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
201+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
202+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
203+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
204+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
205+
assertThat(fieldQuery.includesMax(), equalTo(true));
206+
assertThat(fieldQuery.includesMin(), equalTo(true));
205207
}
206208

207209
@Test public void testTermQuery() throws IOException {
208210
IndexQueryParser queryParser = newQueryParser();
209211
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/term.json");
210212
Query parsedQuery = queryParser.parse(query);
211-
assertThat(parsedQuery, instanceOf(TermQuery.class));
212-
TermQuery termQuery = (TermQuery) parsedQuery;
213-
// since age is automatically registered in data, we encode it as numeric
214-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
213+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
214+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
215+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
216+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
217+
assertThat(fieldQuery.includesMax(), equalTo(true));
218+
assertThat(fieldQuery.includesMin(), equalTo(true));
215219
}
216220

217221
@Test public void testFieldQueryBuilder1() throws IOException {
218222
IndexQueryParser queryParser = newQueryParser();
219223
Query parsedQuery = queryParser.parse(fieldQuery("age", 34).buildAsBytes());
220-
assertThat(parsedQuery, instanceOf(TermQuery.class));
221-
TermQuery termQuery = (TermQuery) parsedQuery;
222-
// since age is automatically registered in data, we encode it as numeric
223-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
224+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
225+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
226+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
227+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
228+
assertThat(fieldQuery.includesMax(), equalTo(true));
229+
assertThat(fieldQuery.includesMin(), equalTo(true));
224230
}
225231

226232
@Test public void testFieldQuery1() throws IOException {
227233
IndexQueryParser queryParser = newQueryParser();
228234
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/field1.json");
229235
Query parsedQuery = queryParser.parse(query);
230-
assertThat(parsedQuery, instanceOf(TermQuery.class));
231-
TermQuery termQuery = (TermQuery) parsedQuery;
232-
// since age is automatically registered in data, we encode it as numeric
233-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
236+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
237+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
238+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
239+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
240+
assertThat(fieldQuery.includesMax(), equalTo(true));
241+
assertThat(fieldQuery.includesMin(), equalTo(true));
234242
}
235243

236244
@Test public void testFieldQuery2() throws IOException {
@@ -251,31 +259,37 @@ public class SimpleJsonIndexQueryParserTests {
251259
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/field3.json");
252260
Query parsedQuery = queryParser.parse(query);
253261
assertThat((double) parsedQuery.getBoost(), closeTo(2.0, 0.01));
254-
assertThat(parsedQuery, instanceOf(TermQuery.class));
255-
TermQuery termQuery = (TermQuery) parsedQuery;
256-
// since age is automatically registered in data, we encode it as numeric
257-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
262+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
263+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
264+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
265+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
266+
assertThat(fieldQuery.includesMax(), equalTo(true));
267+
assertThat(fieldQuery.includesMin(), equalTo(true));
258268
}
259269

260270
@Test public void testTermWithBoostQueryBuilder() throws IOException {
261271
IndexQueryParser queryParser = newQueryParser();
262272
Query parsedQuery = queryParser.parse(termQuery("age", 34).boost(2.0f));
263-
assertThat(parsedQuery, instanceOf(TermQuery.class));
264-
TermQuery termQuery = (TermQuery) parsedQuery;
265-
// since age is automatically registered in data, we encode it as numeric
266-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
267-
assertThat((double) termQuery.getBoost(), closeTo(2.0, 0.01));
273+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
274+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
275+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
276+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
277+
assertThat(fieldQuery.includesMax(), equalTo(true));
278+
assertThat(fieldQuery.includesMin(), equalTo(true));
279+
assertThat((double) fieldQuery.getBoost(), closeTo(2.0, 0.01));
268280
}
269281

270282
@Test public void testTermWithBoostQuery() throws IOException {
271283
IndexQueryParser queryParser = newQueryParser();
272284
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/term-with-boost.json");
273285
Query parsedQuery = queryParser.parse(query);
274-
assertThat(parsedQuery, instanceOf(TermQuery.class));
275-
TermQuery termQuery = (TermQuery) parsedQuery;
276-
// since age is automatically registered in data, we encode it as numeric
277-
assertThat(termQuery.getTerm(), equalTo(new Term("age", NumericUtils.longToPrefixCoded(34))));
278-
assertThat((double) termQuery.getBoost(), closeTo(2.0, 0.01));
286+
assertThat(parsedQuery, instanceOf(NumericRangeQuery.class));
287+
NumericRangeQuery fieldQuery = (NumericRangeQuery) parsedQuery;
288+
assertThat(fieldQuery.getMin().intValue(), equalTo(34));
289+
assertThat(fieldQuery.getMax().intValue(), equalTo(34));
290+
assertThat(fieldQuery.includesMax(), equalTo(true));
291+
assertThat(fieldQuery.includesMin(), equalTo(true));
292+
assertThat((double) fieldQuery.getBoost(), closeTo(2.0, 0.01));
279293
}
280294

281295
@Test public void testPrefixQueryBuilder() throws IOException {

modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/disMax.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
boost: 1.2,
55
queries : [
66
{
7-
term : { age : 34 }
7+
term : { "name.first" : "first" }
88
},
99
{
10-
term : { age : 35 }
10+
term : { "name.last" : "last" }
1111
}
1212
]
1313
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
field : { age : 34 }
2+
"field" : { "age" : 34 }
33
}

0 commit comments

Comments
 (0)