|
@@ -37,6 +37,7 @@ import org.elasticsearch.search.fetch.subphase.DocValueFieldsContext.FieldAndFor
|
|
|
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
|
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
|
|
import org.elasticsearch.search.sort.SortBuilder;
|
|
|
+import org.elasticsearch.search.collapse.CollapseBuilder;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
@@ -55,6 +56,8 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
public static final ParseField NAME_FIELD = new ParseField("name");
|
|
|
public static final ParseField IGNORE_UNMAPPED = new ParseField("ignore_unmapped");
|
|
|
public static final QueryBuilder DEFAULT_INNER_HIT_QUERY = new MatchAllQueryBuilder();
|
|
|
+ public static final ParseField COLLAPSE_FIELD = new ParseField("collapse");
|
|
|
+ public static final ParseField FIELD_FIELD = new ParseField("field");
|
|
|
|
|
|
private static final ObjectParser<InnerHitBuilder, Void> PARSER = new ObjectParser<>("inner_hits", InnerHitBuilder::new);
|
|
|
|
|
@@ -91,6 +94,28 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
}, SearchSourceBuilder._SOURCE_FIELD, ObjectParser.ValueType.OBJECT_ARRAY_BOOLEAN_OR_STRING);
|
|
|
PARSER.declareObject(InnerHitBuilder::setHighlightBuilder, (p, c) -> HighlightBuilder.fromXContent(p),
|
|
|
SearchSourceBuilder.HIGHLIGHT_FIELD);
|
|
|
+ PARSER.declareField((parser, builder, context) -> {
|
|
|
+ Boolean isParsedCorrectly = false;
|
|
|
+ String field;
|
|
|
+ if (parser.currentToken() == XContentParser.Token.START_OBJECT) {
|
|
|
+ if (parser.nextToken() == XContentParser.Token.FIELD_NAME) {
|
|
|
+ if (FIELD_FIELD.match(parser.currentName(), parser.getDeprecationHandler())) {
|
|
|
+ if (parser.nextToken() == XContentParser.Token.VALUE_STRING){
|
|
|
+ field = parser.text();
|
|
|
+ if (parser.nextToken() == XContentParser.Token.END_OBJECT){
|
|
|
+ isParsedCorrectly = true;
|
|
|
+ CollapseBuilder cb = new CollapseBuilder(field);
|
|
|
+ builder.setInnerCollapse(cb);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isParsedCorrectly == false) {
|
|
|
+ throw new ParsingException(parser.getTokenLocation(), "Invalid token in the inner collapse");
|
|
|
+ }
|
|
|
+
|
|
|
+ }, COLLAPSE_FIELD, ObjectParser.ValueType.OBJECT);
|
|
|
}
|
|
|
|
|
|
private String name;
|
|
@@ -109,6 +134,7 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
private Set<ScriptField> scriptFields;
|
|
|
private HighlightBuilder highlightBuilder;
|
|
|
private FetchSourceContext fetchSourceContext;
|
|
|
+ private CollapseBuilder innerCollapseBuilder = null;
|
|
|
|
|
|
public InnerHitBuilder() {
|
|
|
this.name = null;
|
|
@@ -173,6 +199,9 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
boolean hasChildren = in.readBoolean();
|
|
|
assert hasChildren == false;
|
|
|
}
|
|
|
+ if (in.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
|
|
|
+ this.innerCollapseBuilder = in.readOptionalWriteable(CollapseBuilder::new);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -218,6 +247,9 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
}
|
|
|
}
|
|
|
out.writeOptionalWriteable(highlightBuilder);
|
|
|
+ if (out.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
|
|
|
+ out.writeOptionalWriteable(innerCollapseBuilder);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -501,6 +533,15 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
return query;
|
|
|
}
|
|
|
|
|
|
+ public InnerHitBuilder setInnerCollapse(CollapseBuilder innerCollapseBuilder) {
|
|
|
+ this.innerCollapseBuilder = innerCollapseBuilder;
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public CollapseBuilder getInnerCollapseBuilder() {
|
|
|
+ return innerCollapseBuilder;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
|
|
builder.startObject();
|
|
@@ -550,6 +591,9 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
if (highlightBuilder != null) {
|
|
|
builder.field(SearchSourceBuilder.HIGHLIGHT_FIELD.getPreferredName(), highlightBuilder, params);
|
|
|
}
|
|
|
+ if (innerCollapseBuilder != null) {
|
|
|
+ builder.field(COLLAPSE_FIELD.getPreferredName(), innerCollapseBuilder);
|
|
|
+ }
|
|
|
builder.endObject();
|
|
|
return builder;
|
|
|
}
|
|
@@ -572,13 +616,14 @@ public final class InnerHitBuilder implements Writeable, ToXContentObject {
|
|
|
Objects.equals(scriptFields, that.scriptFields) &&
|
|
|
Objects.equals(fetchSourceContext, that.fetchSourceContext) &&
|
|
|
Objects.equals(sorts, that.sorts) &&
|
|
|
- Objects.equals(highlightBuilder, that.highlightBuilder);
|
|
|
+ Objects.equals(highlightBuilder, that.highlightBuilder) &&
|
|
|
+ Objects.equals(innerCollapseBuilder, that.innerCollapseBuilder);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public int hashCode() {
|
|
|
return Objects.hash(name, ignoreUnmapped, from, size, explain, version, trackScores,
|
|
|
- storedFieldsContext, docValueFields, scriptFields, fetchSourceContext, sorts, highlightBuilder);
|
|
|
+ storedFieldsContext, docValueFields, scriptFields, fetchSourceContext, sorts, highlightBuilder, innerCollapseBuilder);
|
|
|
}
|
|
|
|
|
|
public static InnerHitBuilder fromXContent(XContentParser parser) throws IOException {
|