4 more queries
This commit is contained in:
parent
2b6866d26b
commit
03ce5e19eb
|
@ -29,10 +29,13 @@ import org.apache.lucene.search.BooleanQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.similarities.Similarity;
|
import org.apache.lucene.search.similarities.Similarity;
|
||||||
import org.apache.lucene.util.BytesRefBuilder;
|
import org.apache.lucene.util.BytesRefBuilder;
|
||||||
|
import org.elasticsearch.common.ParseField;
|
||||||
|
import org.elasticsearch.common.ParsingException;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.mapper.MappedFieldType;
|
import org.elasticsearch.index.mapper.MappedFieldType;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -56,15 +59,24 @@ import java.util.Objects;
|
||||||
public class CommonTermsQueryBuilder extends AbstractQueryBuilder<CommonTermsQueryBuilder> {
|
public class CommonTermsQueryBuilder extends AbstractQueryBuilder<CommonTermsQueryBuilder> {
|
||||||
|
|
||||||
public static final String NAME = "common";
|
public static final String NAME = "common";
|
||||||
|
public static final ParseField QUERY_NAME_FIELD = new ParseField(NAME);
|
||||||
|
public static final CommonTermsQueryBuilder PROTOTYPE = new CommonTermsQueryBuilder("field", "text");
|
||||||
|
|
||||||
public static final float DEFAULT_CUTOFF_FREQ = 0.01f;
|
public static final float DEFAULT_CUTOFF_FREQ = 0.01f;
|
||||||
|
|
||||||
public static final Operator DEFAULT_HIGH_FREQ_OCCUR = Operator.OR;
|
public static final Operator DEFAULT_HIGH_FREQ_OCCUR = Operator.OR;
|
||||||
|
|
||||||
public static final Operator DEFAULT_LOW_FREQ_OCCUR = Operator.OR;
|
public static final Operator DEFAULT_LOW_FREQ_OCCUR = Operator.OR;
|
||||||
|
|
||||||
public static final boolean DEFAULT_DISABLE_COORD = true;
|
public static final boolean DEFAULT_DISABLE_COORD = true;
|
||||||
|
|
||||||
|
private static final ParseField CUTOFF_FREQUENCY_FIELD = new ParseField("cutoff_frequency");
|
||||||
|
private static final ParseField MINIMUM_SHOULD_MATCH_FIELD = new ParseField("minimum_should_match");
|
||||||
|
private static final ParseField LOW_FREQ_OPERATOR_FIELD = new ParseField("low_freq_operator");
|
||||||
|
private static final ParseField HIGH_FREQ_OPERATOR_FIELD = new ParseField("high_freq_operator");
|
||||||
|
private static final ParseField DISABLE_COORD_FIELD = new ParseField("disable_coord");
|
||||||
|
private static final ParseField ANALYZER_FIELD = new ParseField("analyzer");
|
||||||
|
private static final ParseField QUERY_FIELD = new ParseField("query");
|
||||||
|
private static final ParseField HIGH_FREQ_FIELD = new ParseField("high_freq");
|
||||||
|
private static final ParseField LOW_FREQ_FIELD = new ParseField("low_freq");
|
||||||
|
|
||||||
private final String fieldName;
|
private final String fieldName;
|
||||||
|
|
||||||
private final Object text;
|
private final Object text;
|
||||||
|
@ -83,8 +95,6 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder<CommonTermsQue
|
||||||
|
|
||||||
private float cutoffFrequency = DEFAULT_CUTOFF_FREQ;
|
private float cutoffFrequency = DEFAULT_CUTOFF_FREQ;
|
||||||
|
|
||||||
static final CommonTermsQueryBuilder PROTOTYPE = new CommonTermsQueryBuilder("field", "text");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new common terms query.
|
* Constructs a new common terms query.
|
||||||
*/
|
*/
|
||||||
|
@ -202,21 +212,21 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder<CommonTermsQue
|
||||||
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
builder.startObject(NAME);
|
builder.startObject(NAME);
|
||||||
builder.startObject(fieldName);
|
builder.startObject(fieldName);
|
||||||
builder.field(CommonTermsQueryParser.QUERY_FIELD.getPreferredName(), text);
|
builder.field(QUERY_FIELD.getPreferredName(), text);
|
||||||
builder.field(CommonTermsQueryParser.DISABLE_COORD_FIELD.getPreferredName(), disableCoord);
|
builder.field(DISABLE_COORD_FIELD.getPreferredName(), disableCoord);
|
||||||
builder.field(CommonTermsQueryParser.HIGH_FREQ_OPERATOR_FIELD.getPreferredName(), highFreqOperator.toString());
|
builder.field(HIGH_FREQ_OPERATOR_FIELD.getPreferredName(), highFreqOperator.toString());
|
||||||
builder.field(CommonTermsQueryParser.LOW_FREQ_OPERATOR_FIELD.getPreferredName(), lowFreqOperator.toString());
|
builder.field(LOW_FREQ_OPERATOR_FIELD.getPreferredName(), lowFreqOperator.toString());
|
||||||
if (analyzer != null) {
|
if (analyzer != null) {
|
||||||
builder.field(CommonTermsQueryParser.ANALYZER_FIELD.getPreferredName(), analyzer);
|
builder.field(ANALYZER_FIELD.getPreferredName(), analyzer);
|
||||||
}
|
}
|
||||||
builder.field(CommonTermsQueryParser.CUTOFF_FREQUENCY_FIELD.getPreferredName(), cutoffFrequency);
|
builder.field(CUTOFF_FREQUENCY_FIELD.getPreferredName(), cutoffFrequency);
|
||||||
if (lowFreqMinimumShouldMatch != null || highFreqMinimumShouldMatch != null) {
|
if (lowFreqMinimumShouldMatch != null || highFreqMinimumShouldMatch != null) {
|
||||||
builder.startObject(CommonTermsQueryParser.MINIMUM_SHOULD_MATCH_FIELD.getPreferredName());
|
builder.startObject(MINIMUM_SHOULD_MATCH_FIELD.getPreferredName());
|
||||||
if (lowFreqMinimumShouldMatch != null) {
|
if (lowFreqMinimumShouldMatch != null) {
|
||||||
builder.field(CommonTermsQueryParser.LOW_FREQ_FIELD.getPreferredName(), lowFreqMinimumShouldMatch);
|
builder.field(LOW_FREQ_FIELD.getPreferredName(), lowFreqMinimumShouldMatch);
|
||||||
}
|
}
|
||||||
if (highFreqMinimumShouldMatch != null) {
|
if (highFreqMinimumShouldMatch != null) {
|
||||||
builder.field(CommonTermsQueryParser.HIGH_FREQ_FIELD.getPreferredName(), highFreqMinimumShouldMatch);
|
builder.field(HIGH_FREQ_FIELD.getPreferredName(), highFreqMinimumShouldMatch);
|
||||||
}
|
}
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
|
@ -225,6 +235,107 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder<CommonTermsQue
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static CommonTermsQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException {
|
||||||
|
XContentParser parser = parseContext.parser();
|
||||||
|
XContentParser.Token token = parser.nextToken();
|
||||||
|
if (token != XContentParser.Token.FIELD_NAME) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME + "] query malformed, no field");
|
||||||
|
}
|
||||||
|
String fieldName = parser.currentName();
|
||||||
|
Object text = null;
|
||||||
|
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
||||||
|
String analyzer = null;
|
||||||
|
String lowFreqMinimumShouldMatch = null;
|
||||||
|
String highFreqMinimumShouldMatch = null;
|
||||||
|
boolean disableCoord = CommonTermsQueryBuilder.DEFAULT_DISABLE_COORD;
|
||||||
|
Operator highFreqOperator = CommonTermsQueryBuilder.DEFAULT_HIGH_FREQ_OCCUR;
|
||||||
|
Operator lowFreqOperator = CommonTermsQueryBuilder.DEFAULT_LOW_FREQ_OCCUR;
|
||||||
|
float cutoffFrequency = CommonTermsQueryBuilder.DEFAULT_CUTOFF_FREQ;
|
||||||
|
String queryName = null;
|
||||||
|
token = parser.nextToken();
|
||||||
|
if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
String currentFieldName = null;
|
||||||
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
|
currentFieldName = parser.currentName();
|
||||||
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) {
|
||||||
|
String innerFieldName = null;
|
||||||
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
|
innerFieldName = parser.currentName();
|
||||||
|
} else if (token.isValue()) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(innerFieldName, LOW_FREQ_FIELD)) {
|
||||||
|
lowFreqMinimumShouldMatch = parser.text();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(innerFieldName, HIGH_FREQ_FIELD)) {
|
||||||
|
highFreqMinimumShouldMatch = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
||||||
|
"] query does not support [" + innerFieldName
|
||||||
|
+ "] for [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
||||||
|
"] unexpected token type [" + token
|
||||||
|
+ "] after [" + innerFieldName + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
||||||
|
"] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
} else if (token.isValue()) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, QUERY_FIELD)) {
|
||||||
|
text = parser.objectText();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, ANALYZER_FIELD)) {
|
||||||
|
analyzer = parser.text();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, DISABLE_COORD_FIELD)) {
|
||||||
|
disableCoord = parser.booleanValue();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
|
||||||
|
boost = parser.floatValue();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, HIGH_FREQ_OPERATOR_FIELD)) {
|
||||||
|
highFreqOperator = Operator.fromString(parser.text());
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, LOW_FREQ_OPERATOR_FIELD)) {
|
||||||
|
lowFreqOperator = Operator.fromString(parser.text());
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) {
|
||||||
|
lowFreqMinimumShouldMatch = parser.text();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, CUTOFF_FREQUENCY_FIELD)) {
|
||||||
|
cutoffFrequency = parser.floatValue();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) {
|
||||||
|
queryName = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
||||||
|
"] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parser.nextToken();
|
||||||
|
} else {
|
||||||
|
text = parser.objectText();
|
||||||
|
// move to the next token
|
||||||
|
token = parser.nextToken();
|
||||||
|
if (token != XContentParser.Token.END_OBJECT) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(),
|
||||||
|
"[common] query parsed in simplified form, with direct field name, but included more options than just " +
|
||||||
|
"the field name, possibly use its 'options' form, with 'query' element?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (text == null) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "No text specified for text query");
|
||||||
|
}
|
||||||
|
return new CommonTermsQueryBuilder(fieldName, text)
|
||||||
|
.lowFreqMinimumShouldMatch(lowFreqMinimumShouldMatch)
|
||||||
|
.highFreqMinimumShouldMatch(highFreqMinimumShouldMatch)
|
||||||
|
.analyzer(analyzer)
|
||||||
|
.highFreqOperator(highFreqOperator)
|
||||||
|
.lowFreqOperator(lowFreqOperator)
|
||||||
|
.disableCoord(disableCoord)
|
||||||
|
.cutoffFrequency(cutoffFrequency)
|
||||||
|
.boost(boost)
|
||||||
|
.queryName(queryName);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getWriteableName() {
|
public String getWriteableName() {
|
||||||
return NAME;
|
return NAME;
|
||||||
|
|
|
@ -1,150 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.index.query;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.ParseField;
|
|
||||||
import org.elasticsearch.common.ParsingException;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parser for common terms query
|
|
||||||
*/
|
|
||||||
public class CommonTermsQueryParser implements QueryParser<CommonTermsQueryBuilder> {
|
|
||||||
|
|
||||||
public static final ParseField QUERY_NAME_FIELD = new ParseField(CommonTermsQueryBuilder.NAME);
|
|
||||||
public static final ParseField CUTOFF_FREQUENCY_FIELD = new ParseField("cutoff_frequency");
|
|
||||||
public static final ParseField MINIMUM_SHOULD_MATCH_FIELD = new ParseField("minimum_should_match");
|
|
||||||
public static final ParseField LOW_FREQ_OPERATOR_FIELD = new ParseField("low_freq_operator");
|
|
||||||
public static final ParseField HIGH_FREQ_OPERATOR_FIELD = new ParseField("high_freq_operator");
|
|
||||||
public static final ParseField DISABLE_COORD_FIELD = new ParseField("disable_coord");
|
|
||||||
public static final ParseField ANALYZER_FIELD = new ParseField("analyzer");
|
|
||||||
public static final ParseField QUERY_FIELD = new ParseField("query");
|
|
||||||
public static final ParseField HIGH_FREQ_FIELD = new ParseField("high_freq");
|
|
||||||
public static final ParseField LOW_FREQ_FIELD = new ParseField("low_freq");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CommonTermsQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException {
|
|
||||||
XContentParser parser = parseContext.parser();
|
|
||||||
XContentParser.Token token = parser.nextToken();
|
|
||||||
if (token != XContentParser.Token.FIELD_NAME) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME + "] query malformed, no field");
|
|
||||||
}
|
|
||||||
String fieldName = parser.currentName();
|
|
||||||
Object text = null;
|
|
||||||
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
|
||||||
String analyzer = null;
|
|
||||||
String lowFreqMinimumShouldMatch = null;
|
|
||||||
String highFreqMinimumShouldMatch = null;
|
|
||||||
boolean disableCoord = CommonTermsQueryBuilder.DEFAULT_DISABLE_COORD;
|
|
||||||
Operator highFreqOperator = CommonTermsQueryBuilder.DEFAULT_HIGH_FREQ_OCCUR;
|
|
||||||
Operator lowFreqOperator = CommonTermsQueryBuilder.DEFAULT_LOW_FREQ_OCCUR;
|
|
||||||
float cutoffFrequency = CommonTermsQueryBuilder.DEFAULT_CUTOFF_FREQ;
|
|
||||||
String queryName = null;
|
|
||||||
token = parser.nextToken();
|
|
||||||
if (token == XContentParser.Token.START_OBJECT) {
|
|
||||||
String currentFieldName = null;
|
|
||||||
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
|
||||||
currentFieldName = parser.currentName();
|
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) {
|
|
||||||
String innerFieldName = null;
|
|
||||||
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
|
||||||
innerFieldName = parser.currentName();
|
|
||||||
} else if (token.isValue()) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(innerFieldName, LOW_FREQ_FIELD)) {
|
|
||||||
lowFreqMinimumShouldMatch = parser.text();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(innerFieldName, HIGH_FREQ_FIELD)) {
|
|
||||||
highFreqMinimumShouldMatch = parser.text();
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
|
||||||
"] query does not support [" + innerFieldName
|
|
||||||
+ "] for [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
|
||||||
"] unexpected token type [" + token
|
|
||||||
+ "] after [" + innerFieldName + "]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
|
||||||
"] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
} else if (token.isValue()) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, QUERY_FIELD)) {
|
|
||||||
text = parser.objectText();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, ANALYZER_FIELD)) {
|
|
||||||
analyzer = parser.text();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, DISABLE_COORD_FIELD)) {
|
|
||||||
disableCoord = parser.booleanValue();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
|
|
||||||
boost = parser.floatValue();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, HIGH_FREQ_OPERATOR_FIELD)) {
|
|
||||||
highFreqOperator = Operator.fromString(parser.text());
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, LOW_FREQ_OPERATOR_FIELD)) {
|
|
||||||
lowFreqOperator = Operator.fromString(parser.text());
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) {
|
|
||||||
lowFreqMinimumShouldMatch = parser.text();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, CUTOFF_FREQUENCY_FIELD)) {
|
|
||||||
cutoffFrequency = parser.floatValue();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) {
|
|
||||||
queryName = parser.text();
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[" + CommonTermsQueryBuilder.NAME +
|
|
||||||
"] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parser.nextToken();
|
|
||||||
} else {
|
|
||||||
text = parser.objectText();
|
|
||||||
// move to the next token
|
|
||||||
token = parser.nextToken();
|
|
||||||
if (token != XContentParser.Token.END_OBJECT) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(),
|
|
||||||
"[common] query parsed in simplified form, with direct field name, but included more options than just " +
|
|
||||||
"the field name, possibly use its 'options' form, with 'query' element?");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text == null) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "No text specified for text query");
|
|
||||||
}
|
|
||||||
return new CommonTermsQueryBuilder(fieldName, text)
|
|
||||||
.lowFreqMinimumShouldMatch(lowFreqMinimumShouldMatch)
|
|
||||||
.highFreqMinimumShouldMatch(highFreqMinimumShouldMatch)
|
|
||||||
.analyzer(analyzer)
|
|
||||||
.highFreqOperator(highFreqOperator)
|
|
||||||
.lowFreqOperator(lowFreqOperator)
|
|
||||||
.disableCoord(disableCoord)
|
|
||||||
.cutoffFrequency(cutoffFrequency)
|
|
||||||
.boost(boost)
|
|
||||||
.queryName(queryName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CommonTermsQueryBuilder getBuilderPrototype() {
|
|
||||||
return CommonTermsQueryBuilder.PROTOTYPE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -20,12 +20,17 @@
|
||||||
package org.elasticsearch.index.query;
|
package org.elasticsearch.index.query;
|
||||||
|
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
|
import org.elasticsearch.common.ParseField;
|
||||||
|
import org.elasticsearch.common.ParsingException;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,16 +40,21 @@ import java.util.Objects;
|
||||||
public class IndicesQueryBuilder extends AbstractQueryBuilder<IndicesQueryBuilder> {
|
public class IndicesQueryBuilder extends AbstractQueryBuilder<IndicesQueryBuilder> {
|
||||||
|
|
||||||
public static final String NAME = "indices";
|
public static final String NAME = "indices";
|
||||||
|
public static final ParseField QUERY_NAME_FIELD = new ParseField(NAME);
|
||||||
|
public static final IndicesQueryBuilder PROTOTYPE = new IndicesQueryBuilder(EmptyQueryBuilder.PROTOTYPE, "index");
|
||||||
|
|
||||||
private final QueryBuilder innerQuery;
|
private static final ParseField QUERY_FIELD = new ParseField("query");
|
||||||
|
private static final ParseField NO_MATCH_QUERY = new ParseField("no_match_query");
|
||||||
|
private static final ParseField INDEX_FIELD = new ParseField("index");
|
||||||
|
private static final ParseField INDICES_FIELD = new ParseField("indices");
|
||||||
|
|
||||||
|
private final QueryBuilder<?> innerQuery;
|
||||||
|
|
||||||
private final String[] indices;
|
private final String[] indices;
|
||||||
|
|
||||||
private QueryBuilder noMatchQuery = defaultNoMatchQuery();
|
private QueryBuilder<?> noMatchQuery = defaultNoMatchQuery();
|
||||||
|
|
||||||
static final IndicesQueryBuilder PROTOTYPE = new IndicesQueryBuilder(EmptyQueryBuilder.PROTOTYPE, "index");
|
public IndicesQueryBuilder(QueryBuilder<?> innerQuery, String... indices) {
|
||||||
|
|
||||||
public IndicesQueryBuilder(QueryBuilder innerQuery, String... indices) {
|
|
||||||
if (innerQuery == null) {
|
if (innerQuery == null) {
|
||||||
throw new IllegalArgumentException("inner query cannot be null");
|
throw new IllegalArgumentException("inner query cannot be null");
|
||||||
}
|
}
|
||||||
|
@ -55,7 +65,7 @@ public class IndicesQueryBuilder extends AbstractQueryBuilder<IndicesQueryBuilde
|
||||||
this.indices = indices;
|
this.indices = indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryBuilder innerQuery() {
|
public QueryBuilder<?> innerQuery() {
|
||||||
return this.innerQuery;
|
return this.innerQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +76,7 @@ public class IndicesQueryBuilder extends AbstractQueryBuilder<IndicesQueryBuilde
|
||||||
/**
|
/**
|
||||||
* Sets the query to use when it executes on an index that does not match the indices provided.
|
* Sets the query to use when it executes on an index that does not match the indices provided.
|
||||||
*/
|
*/
|
||||||
public IndicesQueryBuilder noMatchQuery(QueryBuilder noMatchQuery) {
|
public IndicesQueryBuilder noMatchQuery(QueryBuilder<?> noMatchQuery) {
|
||||||
if (noMatchQuery == null) {
|
if (noMatchQuery == null) {
|
||||||
throw new IllegalArgumentException("noMatch query cannot be null");
|
throw new IllegalArgumentException("noMatch query cannot be null");
|
||||||
}
|
}
|
||||||
|
@ -78,30 +88,107 @@ public class IndicesQueryBuilder extends AbstractQueryBuilder<IndicesQueryBuilde
|
||||||
* Sets the no match query, can either be <tt>all</tt> or <tt>none</tt>.
|
* Sets the no match query, can either be <tt>all</tt> or <tt>none</tt>.
|
||||||
*/
|
*/
|
||||||
public IndicesQueryBuilder noMatchQuery(String type) {
|
public IndicesQueryBuilder noMatchQuery(String type) {
|
||||||
this.noMatchQuery = IndicesQueryParser.parseNoMatchQuery(type);
|
this.noMatchQuery = parseNoMatchQuery(type);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryBuilder noMatchQuery() {
|
public QueryBuilder<?> noMatchQuery() {
|
||||||
return this.noMatchQuery;
|
return this.noMatchQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QueryBuilder defaultNoMatchQuery() {
|
private static QueryBuilder<?> defaultNoMatchQuery() {
|
||||||
return QueryBuilders.matchAllQuery();
|
return QueryBuilders.matchAllQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
builder.startObject(NAME);
|
builder.startObject(NAME);
|
||||||
builder.field(IndicesQueryParser.INDICES_FIELD.getPreferredName(), indices);
|
builder.field(INDICES_FIELD.getPreferredName(), indices);
|
||||||
builder.field(IndicesQueryParser.QUERY_FIELD.getPreferredName());
|
builder.field(QUERY_FIELD.getPreferredName());
|
||||||
innerQuery.toXContent(builder, params);
|
innerQuery.toXContent(builder, params);
|
||||||
builder.field(IndicesQueryParser.NO_MATCH_QUERY.getPreferredName());
|
builder.field(NO_MATCH_QUERY.getPreferredName());
|
||||||
noMatchQuery.toXContent(builder, params);
|
noMatchQuery.toXContent(builder, params);
|
||||||
printBoostAndQueryName(builder);
|
printBoostAndQueryName(builder);
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IndicesQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException, ParsingException {
|
||||||
|
XContentParser parser = parseContext.parser();
|
||||||
|
|
||||||
|
QueryBuilder<?> innerQuery = null;
|
||||||
|
Collection<String> indices = new ArrayList<>();
|
||||||
|
QueryBuilder<?> noMatchQuery = defaultNoMatchQuery();
|
||||||
|
|
||||||
|
String queryName = null;
|
||||||
|
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
||||||
|
|
||||||
|
String currentFieldName = null;
|
||||||
|
XContentParser.Token token;
|
||||||
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
|
currentFieldName = parser.currentName();
|
||||||
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, QUERY_FIELD)) {
|
||||||
|
innerQuery = parseContext.parseInnerQueryBuilder();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, NO_MATCH_QUERY)) {
|
||||||
|
noMatchQuery = parseContext.parseInnerQueryBuilder();
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
} else if (token == XContentParser.Token.START_ARRAY) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, INDICES_FIELD)) {
|
||||||
|
if (indices.isEmpty() == false) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] indices or index already specified");
|
||||||
|
}
|
||||||
|
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
||||||
|
String value = parser.textOrNull();
|
||||||
|
if (value == null) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] no value specified for 'indices' entry");
|
||||||
|
}
|
||||||
|
indices.add(value);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
} else if (token.isValue()) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, INDEX_FIELD)) {
|
||||||
|
if (indices.isEmpty() == false) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] indices or index already specified");
|
||||||
|
}
|
||||||
|
indices.add(parser.text());
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, NO_MATCH_QUERY)) {
|
||||||
|
noMatchQuery = parseNoMatchQuery(parser.text());
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) {
|
||||||
|
queryName = parser.text();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
|
||||||
|
boost = parser.floatValue();
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (innerQuery == null) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] requires 'query' element");
|
||||||
|
}
|
||||||
|
if (indices.isEmpty()) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[indices] requires 'indices' or 'index' element");
|
||||||
|
}
|
||||||
|
return new IndicesQueryBuilder(innerQuery, indices.toArray(new String[indices.size()]))
|
||||||
|
.noMatchQuery(noMatchQuery)
|
||||||
|
.boost(boost)
|
||||||
|
.queryName(queryName);
|
||||||
|
}
|
||||||
|
|
||||||
|
static QueryBuilder<?> parseNoMatchQuery(String type) {
|
||||||
|
if ("all".equals(type)) {
|
||||||
|
return QueryBuilders.matchAllQuery();
|
||||||
|
} else if ("none".equals(type)) {
|
||||||
|
return new MatchNoneQueryBuilder();
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("query type can only be [all] or [none] but not " + "[" + type + "]");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getWriteableName() {
|
public String getWriteableName() {
|
||||||
return NAME;
|
return NAME;
|
||||||
|
|
|
@ -1,123 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.index.query;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.ParseField;
|
|
||||||
import org.elasticsearch.common.ParsingException;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parser for {@link IndicesQueryBuilder}.
|
|
||||||
*/
|
|
||||||
public class IndicesQueryParser implements QueryParser {
|
|
||||||
|
|
||||||
public static final ParseField QUERY_NAME_FIELD = new ParseField(IndicesQueryBuilder.NAME);
|
|
||||||
public static final ParseField QUERY_FIELD = new ParseField("query");
|
|
||||||
public static final ParseField NO_MATCH_QUERY = new ParseField("no_match_query");
|
|
||||||
public static final ParseField INDEX_FIELD = new ParseField("index");
|
|
||||||
public static final ParseField INDICES_FIELD = new ParseField("indices");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public QueryBuilder fromXContent(QueryParseContext parseContext) throws IOException, ParsingException {
|
|
||||||
XContentParser parser = parseContext.parser();
|
|
||||||
|
|
||||||
QueryBuilder innerQuery = null;
|
|
||||||
Collection<String> indices = new ArrayList<>();
|
|
||||||
QueryBuilder noMatchQuery = IndicesQueryBuilder.defaultNoMatchQuery();
|
|
||||||
|
|
||||||
String queryName = null;
|
|
||||||
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
|
||||||
|
|
||||||
String currentFieldName = null;
|
|
||||||
XContentParser.Token token;
|
|
||||||
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
|
||||||
currentFieldName = parser.currentName();
|
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, QUERY_FIELD)) {
|
|
||||||
innerQuery = parseContext.parseInnerQueryBuilder();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, NO_MATCH_QUERY)) {
|
|
||||||
noMatchQuery = parseContext.parseInnerQueryBuilder();
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
} else if (token == XContentParser.Token.START_ARRAY) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, INDICES_FIELD)) {
|
|
||||||
if (indices.isEmpty() == false) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] indices or index already specified");
|
|
||||||
}
|
|
||||||
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
|
|
||||||
String value = parser.textOrNull();
|
|
||||||
if (value == null) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] no value specified for 'indices' entry");
|
|
||||||
}
|
|
||||||
indices.add(value);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
} else if (token.isValue()) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, INDEX_FIELD)) {
|
|
||||||
if (indices.isEmpty() == false) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] indices or index already specified");
|
|
||||||
}
|
|
||||||
indices.add(parser.text());
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, NO_MATCH_QUERY)) {
|
|
||||||
noMatchQuery = parseNoMatchQuery(parser.text());
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) {
|
|
||||||
queryName = parser.text();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
|
|
||||||
boost = parser.floatValue();
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (innerQuery == null) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] requires 'query' element");
|
|
||||||
}
|
|
||||||
if (indices.isEmpty()) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[indices] requires 'indices' or 'index' element");
|
|
||||||
}
|
|
||||||
return new IndicesQueryBuilder(innerQuery, indices.toArray(new String[indices.size()]))
|
|
||||||
.noMatchQuery(noMatchQuery)
|
|
||||||
.boost(boost)
|
|
||||||
.queryName(queryName);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QueryBuilder parseNoMatchQuery(String type) {
|
|
||||||
if ("all".equals(type)) {
|
|
||||||
return QueryBuilders.matchAllQuery();
|
|
||||||
} else if ("none".equals(type)) {
|
|
||||||
return new MatchNoneQueryBuilder();
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("query type can only be [all] or [none] but not " + "[" + type + "]");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IndicesQueryBuilder getBuilderPrototype() {
|
|
||||||
return IndicesQueryBuilder.PROTOTYPE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -24,9 +24,12 @@ import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.spans.SpanBoostQuery;
|
import org.apache.lucene.search.spans.SpanBoostQuery;
|
||||||
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
||||||
import org.apache.lucene.search.spans.SpanQuery;
|
import org.apache.lucene.search.spans.SpanQuery;
|
||||||
|
import org.elasticsearch.common.ParseField;
|
||||||
|
import org.elasticsearch.common.ParsingException;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -39,8 +42,13 @@ public class SpanMultiTermQueryBuilder extends AbstractQueryBuilder<SpanMultiTer
|
||||||
implements SpanQueryBuilder<SpanMultiTermQueryBuilder> {
|
implements SpanQueryBuilder<SpanMultiTermQueryBuilder> {
|
||||||
|
|
||||||
public static final String NAME = "span_multi";
|
public static final String NAME = "span_multi";
|
||||||
|
public static final ParseField QUERY_NAME_FIELD = new ParseField(NAME);
|
||||||
|
|
||||||
|
public static final SpanMultiTermQueryBuilder PROTOTYPE = new SpanMultiTermQueryBuilder(RangeQueryBuilder.PROTOTYPE);
|
||||||
|
|
||||||
|
private static final ParseField MATCH_FIELD = new ParseField("match");
|
||||||
|
|
||||||
private final MultiTermQueryBuilder multiTermQueryBuilder;
|
private final MultiTermQueryBuilder multiTermQueryBuilder;
|
||||||
static final SpanMultiTermQueryBuilder PROTOTYPE = new SpanMultiTermQueryBuilder(RangeQueryBuilder.PROTOTYPE);
|
|
||||||
|
|
||||||
public SpanMultiTermQueryBuilder(MultiTermQueryBuilder multiTermQueryBuilder) {
|
public SpanMultiTermQueryBuilder(MultiTermQueryBuilder multiTermQueryBuilder) {
|
||||||
if (multiTermQueryBuilder == null) {
|
if (multiTermQueryBuilder == null) {
|
||||||
|
@ -57,12 +65,52 @@ public class SpanMultiTermQueryBuilder extends AbstractQueryBuilder<SpanMultiTer
|
||||||
protected void doXContent(XContentBuilder builder, Params params)
|
protected void doXContent(XContentBuilder builder, Params params)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
builder.startObject(NAME);
|
builder.startObject(NAME);
|
||||||
builder.field(SpanMultiTermQueryParser.MATCH_FIELD.getPreferredName());
|
builder.field(MATCH_FIELD.getPreferredName());
|
||||||
multiTermQueryBuilder.toXContent(builder, params);
|
multiTermQueryBuilder.toXContent(builder, params);
|
||||||
printBoostAndQueryName(builder);
|
printBoostAndQueryName(builder);
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static SpanMultiTermQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException {
|
||||||
|
XContentParser parser = parseContext.parser();
|
||||||
|
String currentFieldName = null;
|
||||||
|
MultiTermQueryBuilder subQuery = null;
|
||||||
|
String queryName = null;
|
||||||
|
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
||||||
|
XContentParser.Token token;
|
||||||
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
|
currentFieldName = parser.currentName();
|
||||||
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, MATCH_FIELD)) {
|
||||||
|
QueryBuilder innerQuery = parseContext.parseInnerQueryBuilder();
|
||||||
|
if (innerQuery instanceof MultiTermQueryBuilder == false) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(),
|
||||||
|
"[span_multi] [" + MATCH_FIELD.getPreferredName() + "] must be of type multi term query");
|
||||||
|
}
|
||||||
|
subQuery = (MultiTermQueryBuilder) innerQuery;
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[span_multi] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
} else if (token.isValue()) {
|
||||||
|
if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) {
|
||||||
|
queryName = parser.text();
|
||||||
|
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
|
||||||
|
boost = parser.floatValue();
|
||||||
|
} else {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[span_multi] query does not support [" + currentFieldName + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subQuery == null) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(),
|
||||||
|
"[span_multi] must have [" + MATCH_FIELD.getPreferredName() + "] multi term query clause");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SpanMultiTermQueryBuilder(subQuery).queryName(queryName).boost(boost);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Query doToQuery(QueryShardContext context) throws IOException {
|
protected Query doToQuery(QueryShardContext context) throws IOException {
|
||||||
Query subQuery = multiTermQueryBuilder.toQuery(context);
|
Query subQuery = multiTermQueryBuilder.toQuery(context);
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package org.elasticsearch.index.query;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.ParseField;
|
|
||||||
import org.elasticsearch.common.ParsingException;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parser for span_multi query
|
|
||||||
*/
|
|
||||||
public class SpanMultiTermQueryParser implements QueryParser<SpanMultiTermQueryBuilder> {
|
|
||||||
|
|
||||||
public static final ParseField QUERY_NAME_FIELD = new ParseField(SpanMultiTermQueryBuilder.NAME);
|
|
||||||
public static final ParseField MATCH_FIELD = new ParseField("match");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SpanMultiTermQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException {
|
|
||||||
XContentParser parser = parseContext.parser();
|
|
||||||
String currentFieldName = null;
|
|
||||||
MultiTermQueryBuilder subQuery = null;
|
|
||||||
String queryName = null;
|
|
||||||
float boost = AbstractQueryBuilder.DEFAULT_BOOST;
|
|
||||||
XContentParser.Token token;
|
|
||||||
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
|
||||||
currentFieldName = parser.currentName();
|
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, MATCH_FIELD)) {
|
|
||||||
QueryBuilder innerQuery = parseContext.parseInnerQueryBuilder();
|
|
||||||
if (innerQuery instanceof MultiTermQueryBuilder == false) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(),
|
|
||||||
"[span_multi] [" + MATCH_FIELD.getPreferredName() + "] must be of type multi term query");
|
|
||||||
}
|
|
||||||
subQuery = (MultiTermQueryBuilder) innerQuery;
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[span_multi] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
} else if (token.isValue()) {
|
|
||||||
if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) {
|
|
||||||
queryName = parser.text();
|
|
||||||
} else if (parseContext.parseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) {
|
|
||||||
boost = parser.floatValue();
|
|
||||||
} else {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[span_multi] query does not support [" + currentFieldName + "]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (subQuery == null) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(),
|
|
||||||
"[span_multi] must have [" + MATCH_FIELD.getPreferredName() + "] multi term query clause");
|
|
||||||
}
|
|
||||||
|
|
||||||
return new SpanMultiTermQueryBuilder(subQuery).queryName(queryName).boost(boost);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SpanMultiTermQueryBuilder getBuilderPrototype() {
|
|
||||||
return SpanMultiTermQueryBuilder.PROTOTYPE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -20,6 +20,8 @@
|
||||||
package org.elasticsearch.index.query;
|
package org.elasticsearch.index.query;
|
||||||
|
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
|
import org.elasticsearch.common.ParseField;
|
||||||
|
import org.elasticsearch.common.ParsingException;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.bytes.BytesReference;
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
|
@ -49,8 +51,13 @@ import java.util.Arrays;
|
||||||
public class WrapperQueryBuilder extends AbstractQueryBuilder<WrapperQueryBuilder> {
|
public class WrapperQueryBuilder extends AbstractQueryBuilder<WrapperQueryBuilder> {
|
||||||
|
|
||||||
public static final String NAME = "wrapper";
|
public static final String NAME = "wrapper";
|
||||||
|
public static final ParseField QUERY_NAME_FIELD = new ParseField(NAME);
|
||||||
|
|
||||||
|
public static final WrapperQueryBuilder PROTOTYPE = new WrapperQueryBuilder((byte[]) new byte[]{0});
|
||||||
|
|
||||||
|
private static final ParseField QUERY_FIELD = new ParseField("query");
|
||||||
|
|
||||||
private final byte[] source;
|
private final byte[] source;
|
||||||
static final WrapperQueryBuilder PROTOTYPE = new WrapperQueryBuilder((byte[]) new byte[]{0});
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a query builder given a query provided as a bytes array
|
* Creates a query builder given a query provided as a bytes array
|
||||||
|
@ -94,10 +101,33 @@ public class WrapperQueryBuilder extends AbstractQueryBuilder<WrapperQueryBuilde
|
||||||
@Override
|
@Override
|
||||||
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
builder.startObject(NAME);
|
builder.startObject(NAME);
|
||||||
builder.field(WrapperQueryParser.QUERY_FIELD.getPreferredName(), source);
|
builder.field(QUERY_FIELD.getPreferredName(), source);
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static WrapperQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException {
|
||||||
|
XContentParser parser = parseContext.parser();
|
||||||
|
|
||||||
|
XContentParser.Token token = parser.nextToken();
|
||||||
|
if (token != XContentParser.Token.FIELD_NAME) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[wrapper] query malformed");
|
||||||
|
}
|
||||||
|
String fieldName = parser.currentName();
|
||||||
|
if (! parseContext.parseFieldMatcher().match(fieldName, QUERY_FIELD)) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "[wrapper] query malformed, expected `query` but was" + fieldName);
|
||||||
|
}
|
||||||
|
parser.nextToken();
|
||||||
|
|
||||||
|
byte[] source = parser.binaryValue();
|
||||||
|
|
||||||
|
parser.nextToken();
|
||||||
|
|
||||||
|
if (source == null) {
|
||||||
|
throw new ParsingException(parser.getTokenLocation(), "wrapper query has no [query] specified");
|
||||||
|
}
|
||||||
|
return new WrapperQueryBuilder(source);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getWriteableName() {
|
public String getWriteableName() {
|
||||||
return NAME;
|
return NAME;
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to Elasticsearch under one or more contributor
|
|
||||||
* license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright
|
|
||||||
* ownership. Elasticsearch licenses this file to you under
|
|
||||||
* the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.elasticsearch.index.query;
|
|
||||||
|
|
||||||
import org.elasticsearch.common.ParseField;
|
|
||||||
import org.elasticsearch.common.ParsingException;
|
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query parser for JSON Queries.
|
|
||||||
*/
|
|
||||||
public class WrapperQueryParser implements QueryParser {
|
|
||||||
|
|
||||||
public static final ParseField QUERY_NAME_FIELD = new ParseField(WrapperQueryBuilder.NAME);
|
|
||||||
public static final ParseField QUERY_FIELD = new ParseField("query");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public QueryBuilder fromXContent(QueryParseContext parseContext) throws IOException {
|
|
||||||
XContentParser parser = parseContext.parser();
|
|
||||||
|
|
||||||
XContentParser.Token token = parser.nextToken();
|
|
||||||
if (token != XContentParser.Token.FIELD_NAME) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[wrapper] query malformed");
|
|
||||||
}
|
|
||||||
String fieldName = parser.currentName();
|
|
||||||
if (! parseContext.parseFieldMatcher().match(fieldName, QUERY_FIELD)) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "[wrapper] query malformed, expected `query` but was" + fieldName);
|
|
||||||
}
|
|
||||||
parser.nextToken();
|
|
||||||
|
|
||||||
byte[] source = parser.binaryValue();
|
|
||||||
|
|
||||||
parser.nextToken();
|
|
||||||
|
|
||||||
if (source == null) {
|
|
||||||
throw new ParsingException(parser.getTokenLocation(), "wrapper query has no [query] specified");
|
|
||||||
}
|
|
||||||
return new WrapperQueryBuilder(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public WrapperQueryBuilder getBuilderPrototype() {
|
|
||||||
return WrapperQueryBuilder.PROTOTYPE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -33,7 +33,7 @@ import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.index.percolator.PercolatorHighlightSubFetchPhase;
|
import org.elasticsearch.index.percolator.PercolatorHighlightSubFetchPhase;
|
||||||
import org.elasticsearch.index.query.BoolQueryParser;
|
import org.elasticsearch.index.query.BoolQueryParser;
|
||||||
import org.elasticsearch.index.query.BoostingQueryParser;
|
import org.elasticsearch.index.query.BoostingQueryParser;
|
||||||
import org.elasticsearch.index.query.CommonTermsQueryParser;
|
import org.elasticsearch.index.query.CommonTermsQueryBuilder;
|
||||||
import org.elasticsearch.index.query.ConstantScoreQueryParser;
|
import org.elasticsearch.index.query.ConstantScoreQueryParser;
|
||||||
import org.elasticsearch.index.query.DisMaxQueryParser;
|
import org.elasticsearch.index.query.DisMaxQueryParser;
|
||||||
import org.elasticsearch.index.query.EmptyQueryBuilder;
|
import org.elasticsearch.index.query.EmptyQueryBuilder;
|
||||||
|
@ -49,7 +49,7 @@ import org.elasticsearch.index.query.GeohashCellQuery;
|
||||||
import org.elasticsearch.index.query.HasChildQueryParser;
|
import org.elasticsearch.index.query.HasChildQueryParser;
|
||||||
import org.elasticsearch.index.query.HasParentQueryParser;
|
import org.elasticsearch.index.query.HasParentQueryParser;
|
||||||
import org.elasticsearch.index.query.IdsQueryParser;
|
import org.elasticsearch.index.query.IdsQueryParser;
|
||||||
import org.elasticsearch.index.query.IndicesQueryParser;
|
import org.elasticsearch.index.query.IndicesQueryBuilder;
|
||||||
import org.elasticsearch.index.query.MatchAllQueryParser;
|
import org.elasticsearch.index.query.MatchAllQueryParser;
|
||||||
import org.elasticsearch.index.query.MatchNoneQueryBuilder;
|
import org.elasticsearch.index.query.MatchNoneQueryBuilder;
|
||||||
import org.elasticsearch.index.query.MatchPhrasePrefixQueryBuilder;
|
import org.elasticsearch.index.query.MatchPhrasePrefixQueryBuilder;
|
||||||
|
@ -71,7 +71,7 @@ import org.elasticsearch.index.query.ScriptQueryBuilder;
|
||||||
import org.elasticsearch.index.query.SimpleQueryStringBuilder;
|
import org.elasticsearch.index.query.SimpleQueryStringBuilder;
|
||||||
import org.elasticsearch.index.query.SpanContainingQueryParser;
|
import org.elasticsearch.index.query.SpanContainingQueryParser;
|
||||||
import org.elasticsearch.index.query.SpanFirstQueryParser;
|
import org.elasticsearch.index.query.SpanFirstQueryParser;
|
||||||
import org.elasticsearch.index.query.SpanMultiTermQueryParser;
|
import org.elasticsearch.index.query.SpanMultiTermQueryBuilder;
|
||||||
import org.elasticsearch.index.query.SpanNearQueryParser;
|
import org.elasticsearch.index.query.SpanNearQueryParser;
|
||||||
import org.elasticsearch.index.query.SpanNotQueryParser;
|
import org.elasticsearch.index.query.SpanNotQueryParser;
|
||||||
import org.elasticsearch.index.query.SpanOrQueryParser;
|
import org.elasticsearch.index.query.SpanOrQueryParser;
|
||||||
|
@ -82,7 +82,7 @@ import org.elasticsearch.index.query.TermQueryParser;
|
||||||
import org.elasticsearch.index.query.TermsQueryParser;
|
import org.elasticsearch.index.query.TermsQueryParser;
|
||||||
import org.elasticsearch.index.query.TypeQueryBuilder;
|
import org.elasticsearch.index.query.TypeQueryBuilder;
|
||||||
import org.elasticsearch.index.query.WildcardQueryParser;
|
import org.elasticsearch.index.query.WildcardQueryParser;
|
||||||
import org.elasticsearch.index.query.WrapperQueryParser;
|
import org.elasticsearch.index.query.WrapperQueryBuilder;
|
||||||
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
|
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
|
||||||
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder;
|
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder;
|
||||||
import org.elasticsearch.index.query.functionscore.ScoreFunctionParser;
|
import org.elasticsearch.index.query.functionscore.ScoreFunctionParser;
|
||||||
|
@ -540,10 +540,12 @@ public class SearchModule extends AbstractModule {
|
||||||
registerQueryParser(new SpanNearQueryParser(), SpanNearQueryParser.QUERY_NAME_FIELD);
|
registerQueryParser(new SpanNearQueryParser(), SpanNearQueryParser.QUERY_NAME_FIELD);
|
||||||
registerQueryParser(new SpanOrQueryParser(), SpanOrQueryParser.QUERY_NAME_FIELD);
|
registerQueryParser(new SpanOrQueryParser(), SpanOrQueryParser.QUERY_NAME_FIELD);
|
||||||
registerQueryParser(new MoreLikeThisQueryParser(), MoreLikeThisQueryParser.QUERY_NAME_FIELD);
|
registerQueryParser(new MoreLikeThisQueryParser(), MoreLikeThisQueryParser.QUERY_NAME_FIELD);
|
||||||
registerQueryParser(new WrapperQueryParser(), WrapperQueryParser.QUERY_NAME_FIELD);
|
registerQuery(WrapperQueryBuilder.PROTOTYPE::readFrom, WrapperQueryBuilder::fromXContent, WrapperQueryBuilder.QUERY_NAME_FIELD);
|
||||||
registerQueryParser(new IndicesQueryParser(), IndicesQueryParser.QUERY_NAME_FIELD);
|
registerQuery(IndicesQueryBuilder.PROTOTYPE::readFrom, IndicesQueryBuilder::fromXContent, IndicesQueryBuilder.QUERY_NAME_FIELD);
|
||||||
registerQueryParser(new CommonTermsQueryParser(), CommonTermsQueryParser.QUERY_NAME_FIELD);
|
registerQuery(CommonTermsQueryBuilder.PROTOTYPE::readFrom, CommonTermsQueryBuilder::fromXContent,
|
||||||
registerQueryParser(new SpanMultiTermQueryParser(), SpanMultiTermQueryParser.QUERY_NAME_FIELD);
|
CommonTermsQueryBuilder.QUERY_NAME_FIELD);
|
||||||
|
registerQuery(SpanMultiTermQueryBuilder.PROTOTYPE::readFrom, SpanMultiTermQueryBuilder::fromXContent,
|
||||||
|
SpanMultiTermQueryBuilder.QUERY_NAME_FIELD);
|
||||||
QueryParser<FunctionScoreQueryBuilder> functionScoreParser = (QueryParseContext c) -> FunctionScoreQueryBuilder
|
QueryParser<FunctionScoreQueryBuilder> functionScoreParser = (QueryParseContext c) -> FunctionScoreQueryBuilder
|
||||||
.fromXContent((String name) -> functionScoreParsers.get(name), c);
|
.fromXContent((String name) -> functionScoreParsers.get(name), c);
|
||||||
registerQuery(FunctionScoreQueryBuilder.PROTOTYPE::readFrom, functionScoreParser, FunctionScoreQueryBuilder.QUERY_NAME_FIELD);
|
registerQuery(FunctionScoreQueryBuilder.PROTOTYPE::readFrom, functionScoreParser, FunctionScoreQueryBuilder.QUERY_NAME_FIELD);
|
||||||
|
|
Loading…
Reference in New Issue