optimize search response xcontent generation

This commit is contained in:
kimchy 2010-10-09 04:01:17 +02:00
parent f64e636415
commit 087b4e6f23
13 changed files with 279 additions and 119 deletions

View File

@ -24,6 +24,7 @@ import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.facets.Facets;
import org.elasticsearch.search.internal.InternalSearchResponse;
@ -161,24 +162,36 @@ public class SearchResponse implements ActionResponse, ToXContent {
return scrollId;
}
static final class Fields {
static final XContentBuilderString _SCROLL_ID = new XContentBuilderString("_scroll_id");
static final XContentBuilderString _SHARDS = new XContentBuilderString("_shards");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString SUCCESSFUL = new XContentBuilderString("successful");
static final XContentBuilderString FAILED = new XContentBuilderString("failed");
static final XContentBuilderString FAILURES = new XContentBuilderString("failures");
static final XContentBuilderString INDEX = new XContentBuilderString("index");
static final XContentBuilderString SHARD = new XContentBuilderString("shard");
static final XContentBuilderString REASON = new XContentBuilderString("reason");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
if (scrollId != null) {
builder.field("_scrollId", scrollId);
builder.field(Fields._SCROLL_ID, scrollId);
}
builder.startObject("_shards");
builder.field("total", totalShards());
builder.field("successful", successfulShards());
builder.field("failed", failedShards());
builder.startObject(Fields._SHARDS);
builder.field(Fields.TOTAL, totalShards());
builder.field(Fields.SUCCESSFUL, successfulShards());
builder.field(Fields.FAILED, failedShards());
if (shardFailures.length > 0) {
builder.startArray("failures");
builder.startArray(Fields.FAILURES);
for (ShardSearchFailure shardFailure : shardFailures) {
builder.startObject();
if (shardFailure.shard() != null) {
builder.field("index", shardFailure.shard().index());
builder.field("shard", shardFailure.shard().shardId());
builder.field(Fields.INDEX, shardFailure.shard().index());
builder.field(Fields.SHARD, shardFailure.shard().shardId());
}
builder.field("reason", shardFailure.reason());
builder.field(Fields.REASON, shardFailure.reason());
builder.endObject();
}
builder.endArray();

View File

@ -103,7 +103,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder startObject(XContentString name) throws IOException {
public XContentBuilder startObject(XContentBuilderString name) throws IOException {
field(name);
startObject();
return this;
@ -128,7 +128,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder array(XContentString name, String... values) throws IOException {
public XContentBuilder array(XContentBuilderString name, String... values) throws IOException {
startArray(name);
for (String value : values) {
value(value);
@ -146,7 +146,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder array(XContentString name, Object... values) throws IOException {
public XContentBuilder array(XContentBuilderString name, Object... values) throws IOException {
startArray(name);
for (Object value : values) {
value(value);
@ -161,7 +161,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder startArray(XContentString name) throws IOException {
public XContentBuilder startArray(XContentBuilderString name) throws IOException {
field(name);
startArray();
return this;
@ -177,19 +177,13 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name) throws IOException {
public XContentBuilder field(XContentBuilderString name) throws IOException {
if (fieldCaseConversion == FieldCaseConversion.UNDERSCORE) {
if (cachedStringBuilder == null) {
cachedStringBuilder = new StringBuilder();
}
generator.writeFieldName(Strings.toUnderscoreCase(name.getValue(), cachedStringBuilder));
generator.writeFieldName(name.underscore());
} else if (fieldCaseConversion == FieldCaseConversion.CAMELCASE) {
if (cachedStringBuilder == null) {
cachedStringBuilder = new StringBuilder();
}
generator.writeFieldName(Strings.toCamelCase(name.getValue(), cachedStringBuilder));
generator.writeFieldName(name.camelCase());
} else {
generator.writeFieldName(name);
generator.writeFieldName(name.underscore());
}
return this;
}
@ -220,7 +214,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, char[] value, int offset, int length) throws IOException {
public XContentBuilder field(XContentBuilderString name, char[] value, int offset, int length) throws IOException {
field(name);
if (value == null) {
generator.writeNull();
@ -240,7 +234,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, String value) throws IOException {
public XContentBuilder field(XContentBuilderString name, String value) throws IOException {
field(name);
if (value == null) {
generator.writeNull();
@ -254,7 +248,7 @@ public final class XContentBuilder {
return field(name, value.intValue());
}
public XContentBuilder field(XContentString name, Integer value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Integer value) throws IOException {
return field(name, value.intValue());
}
@ -264,7 +258,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, int value) throws IOException {
public XContentBuilder field(XContentBuilderString name, int value) throws IOException {
field(name);
generator.writeNumber(value);
return this;
@ -274,7 +268,7 @@ public final class XContentBuilder {
return field(name, value.longValue());
}
public XContentBuilder field(XContentString name, Long value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Long value) throws IOException {
return field(name, value.longValue());
}
@ -284,7 +278,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, long value) throws IOException {
public XContentBuilder field(XContentBuilderString name, long value) throws IOException {
field(name);
generator.writeNumber(value);
return this;
@ -294,7 +288,7 @@ public final class XContentBuilder {
return field(name, value.floatValue());
}
public XContentBuilder field(XContentString name, Float value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Float value) throws IOException {
return field(name, value.floatValue());
}
@ -304,7 +298,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, float value) throws IOException {
public XContentBuilder field(XContentBuilderString name, float value) throws IOException {
field(name);
generator.writeNumber(value);
return this;
@ -314,7 +308,7 @@ public final class XContentBuilder {
return field(name, value.doubleValue());
}
public XContentBuilder field(XContentString name, Double value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Double value) throws IOException {
return field(name, value.doubleValue());
}
@ -324,7 +318,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, double value) throws IOException {
public XContentBuilder field(XContentBuilderString name, double value) throws IOException {
field(name);
generator.writeNumber(value);
return this;
@ -336,7 +330,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, Map<String, Object> value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Map<String, Object> value) throws IOException {
field(name);
value(value);
return this;
@ -351,7 +345,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, List<Object> value) throws IOException {
public XContentBuilder field(XContentBuilderString name, List<Object> value) throws IOException {
startArray(name);
for (Object o : value) {
value(o);
@ -369,7 +363,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, String... value) throws IOException {
public XContentBuilder field(XContentBuilderString name, String... value) throws IOException {
startArray(name);
for (String o : value) {
value(o);
@ -387,7 +381,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, Object... value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Object... value) throws IOException {
startArray(name);
for (Object o : value) {
value(o);
@ -405,7 +399,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, int... value) throws IOException {
public XContentBuilder field(XContentBuilderString name, int... value) throws IOException {
startArray(name);
for (Object o : value) {
value(o);
@ -423,7 +417,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, long... value) throws IOException {
public XContentBuilder field(XContentBuilderString name, long... value) throws IOException {
startArray(name);
for (Object o : value) {
value(o);
@ -441,7 +435,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, float... value) throws IOException {
public XContentBuilder field(XContentBuilderString name, float... value) throws IOException {
startArray(name);
for (Object o : value) {
value(o);
@ -459,7 +453,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, double... value) throws IOException {
public XContentBuilder field(XContentBuilderString name, double... value) throws IOException {
startArray(name);
for (Object o : value) {
value(o);
@ -512,7 +506,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, Object value) throws IOException {
public XContentBuilder field(XContentBuilderString name, Object value) throws IOException {
if (value == null) {
nullField(name);
return this;
@ -593,7 +587,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, boolean value) throws IOException {
public XContentBuilder field(XContentBuilderString name, boolean value) throws IOException {
field(name);
generator.writeBoolean(value);
return this;
@ -605,7 +599,7 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder field(XContentString name, byte[] value) throws IOException {
public XContentBuilder field(XContentBuilderString name, byte[] value) throws IOException {
field(name);
generator.writeBinary(value);
return this;
@ -616,7 +610,7 @@ public final class XContentBuilder {
return value(date);
}
public XContentBuilder field(XContentString name, ReadableInstant date) throws IOException {
public XContentBuilder field(XContentBuilderString name, ReadableInstant date) throws IOException {
field(name);
return value(date);
}
@ -626,7 +620,7 @@ public final class XContentBuilder {
return value(date, formatter);
}
public XContentBuilder field(XContentString name, ReadableInstant date, DateTimeFormatter formatter) throws IOException {
public XContentBuilder field(XContentBuilderString name, ReadableInstant date, DateTimeFormatter formatter) throws IOException {
field(name);
return value(date, formatter);
}
@ -636,7 +630,7 @@ public final class XContentBuilder {
return value(date);
}
public XContentBuilder field(XContentString name, Date date) throws IOException {
public XContentBuilder field(XContentBuilderString name, Date date) throws IOException {
field(name);
return value(date);
}
@ -646,7 +640,7 @@ public final class XContentBuilder {
return value(date, formatter);
}
public XContentBuilder field(XContentString name, Date date, DateTimeFormatter formatter) throws IOException {
public XContentBuilder field(XContentBuilderString name, Date date, DateTimeFormatter formatter) throws IOException {
field(name);
return value(date, formatter);
}
@ -656,8 +650,9 @@ public final class XContentBuilder {
return this;
}
public XContentBuilder nullField(XContentString name) throws IOException {
generator.writeNullField(name);
public XContentBuilder nullField(XContentBuilderString name) throws IOException {
field(name);
generator.writeNull();
return this;
}

View File

@ -0,0 +1,45 @@
/*
* Licensed to Elastic Search and Shay Banon under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Elastic Search 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.common.xcontent;
import org.elasticsearch.common.Strings;
/**
* @author kimchy (shay.banon)
*/
public class XContentBuilderString {
private final XContentString underscore;
private final XContentString camelCase;
public XContentBuilderString(String value) {
underscore = new XContentString(Strings.toUnderscoreCase(value));
camelCase = new XContentString(Strings.toCamelCase(value));
}
public XContentString underscore() {
return underscore;
}
public XContentString camelCase() {
return camelCase;
}
}

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facets.filter;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -88,10 +89,15 @@ public class InternalFilterFacet implements FilterFacet, InternalFacet {
return new InternalFilterFacet(name, count);
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", FilterFacetCollectorParser.NAME);
builder.field("count", count);
builder.field(Fields._TYPE, FilterFacetCollectorParser.NAME);
builder.field(Fields.COUNT, count);
builder.endObject();
}

View File

@ -24,6 +24,7 @@ import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -159,24 +160,38 @@ public class InternalGeoDistanceFacet implements GeoDistanceFacet, InternalFacet
}
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString _FIELD = new XContentBuilderString("_field");
static final XContentBuilderString _VALUE_FIELD = new XContentBuilderString("_value_field");
static final XContentBuilderString _UNIT = new XContentBuilderString("_unit");
static final XContentBuilderString RANGES = new XContentBuilderString("ranges");
static final XContentBuilderString FROM = new XContentBuilderString("from");
static final XContentBuilderString TO = new XContentBuilderString("to");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString MEAN = new XContentBuilderString("mean");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", "geo_distance");
builder.field("_field", fieldName);
builder.field("_value_field", valueFieldName);
builder.field("_unit", unit);
builder.startArray("ranges");
builder.field(Fields._TYPE, "geo_distance");
builder.field(Fields._FIELD, fieldName);
builder.field(Fields._VALUE_FIELD, valueFieldName);
builder.field(Fields._UNIT, unit);
builder.startArray(Fields.RANGES);
for (Entry entry : entries) {
builder.startObject();
if (!Double.isInfinite(entry.from)) {
builder.field("from", entry.from);
builder.field(Fields.FROM, entry.from);
}
if (!Double.isInfinite(entry.to)) {
builder.field("to", entry.to);
builder.field(Fields.TO, entry.to);
}
builder.field("count", entry.count());
builder.field("total", entry.total());
builder.field("mean", entry.mean());
builder.field(Fields.COUNT, entry.count());
builder.field(Fields.TOTAL, entry.total());
builder.field(Fields.MEAN, entry.mean());
builder.endObject();
}
builder.endArray();

View File

@ -27,6 +27,7 @@ import org.elasticsearch.common.trove.TLongDoubleIterator;
import org.elasticsearch.common.trove.TLongLongHashMap;
import org.elasticsearch.common.trove.TLongLongIterator;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -174,20 +175,33 @@ public class InternalHistogramFacet implements HistogramFacet, InternalFacet {
return new InternalHistogramFacet(name, keyFieldName, valueFieldName, interval, comparatorType, counts, totals);
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString _KEY_FIELD = new XContentBuilderString("_key_field");
static final XContentBuilderString _VALUE_FIELD = new XContentBuilderString("_value_field");
static final XContentBuilderString _COMPARATOR = new XContentBuilderString("_comparator");
static final XContentBuilderString _INTERVAL = new XContentBuilderString("_interval");
static final XContentBuilderString ENTRIES = new XContentBuilderString("entries");
static final XContentBuilderString KEY = new XContentBuilderString("key");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString MEAN = new XContentBuilderString("mean");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", HistogramFacetCollectorParser.NAME);
builder.field("_key_field", keyFieldName);
builder.field("_value_field", valueFieldName);
builder.field("_comparator", comparatorType.description());
builder.field("_interval", interval);
builder.startArray("entries");
builder.field(Fields._TYPE, HistogramFacetCollectorParser.NAME);
builder.field(Fields._KEY_FIELD, keyFieldName);
builder.field(Fields._VALUE_FIELD, valueFieldName);
builder.field(Fields._COMPARATOR, comparatorType.description());
builder.field(Fields._INTERVAL, interval);
builder.startArray(Fields.ENTRIES);
for (Entry entry : computeEntries()) {
builder.startObject();
builder.field("key", entry.key());
builder.field("count", entry.count());
builder.field("total", entry.total());
builder.field("mean", entry.mean());
builder.field(Fields.KEY, entry.key());
builder.field(Fields.COUNT, entry.count());
builder.field(Fields.TOTAL, entry.total());
builder.field(Fields.MEAN, entry.mean());
builder.endObject();
}
builder.endArray();

View File

@ -27,6 +27,7 @@ import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Streamable;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.Facets;
import org.elasticsearch.search.facets.filter.InternalFilterFacet;
@ -114,8 +115,12 @@ public class InternalFacets implements Facets, Streamable, ToXContent, Iterable<
return (T) facetsAsMap().get(name);
}
static final class Fields {
static final XContentBuilderString FACETS = new XContentBuilderString("facets");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject("facets");
builder.startObject(Fields.FACETS);
for (Facet facet : facets) {
((InternalFacet) facet).toXContent(builder, params);
}

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facets.query;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -88,10 +89,15 @@ public class InternalQueryFacet implements QueryFacet, InternalFacet {
return new InternalQueryFacet(name, count);
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", QueryFacetCollectorParser.NAME);
builder.field("count", count);
builder.field(Fields._TYPE, QueryFacetCollectorParser.NAME);
builder.field(Fields.COUNT, count);
builder.endObject();
}

View File

@ -23,6 +23,7 @@ import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -168,29 +169,43 @@ public class InternalRangeFacet implements RangeFacet, InternalFacet {
}
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString _KEY_FIELD = new XContentBuilderString("_key_field");
static final XContentBuilderString _VALUE_FIELD = new XContentBuilderString("_value_field");
static final XContentBuilderString RANGES = new XContentBuilderString("ranges");
static final XContentBuilderString FROM = new XContentBuilderString("from");
static final XContentBuilderString FROM_STR = new XContentBuilderString("from_str");
static final XContentBuilderString TO = new XContentBuilderString("to");
static final XContentBuilderString TO_STR = new XContentBuilderString("to_str");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString MEAN = new XContentBuilderString("mean");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", "range");
builder.field("_key_field", keyFieldName);
builder.field("_value_field", valueFieldName);
builder.startArray("ranges");
builder.field(Fields._TYPE, "range");
builder.field(Fields._KEY_FIELD, keyFieldName);
builder.field(Fields._VALUE_FIELD, valueFieldName);
builder.startArray(Fields.RANGES);
for (Entry entry : entries) {
builder.startObject();
if (!Double.isInfinite(entry.from)) {
builder.field("from", entry.from);
builder.field(Fields.FROM, entry.from);
}
if (entry.fromAsString != null) {
builder.field("from_str", entry.fromAsString);
builder.field(Fields.FROM_STR, entry.fromAsString);
}
if (!Double.isInfinite(entry.to)) {
builder.field("to", entry.to);
builder.field(Fields.TO, entry.to);
}
if (entry.toAsString != null) {
builder.field("to_str", entry.toAsString);
builder.field(Fields.TO_STR, entry.toAsString);
}
builder.field("count", entry.count());
builder.field("total", entry.total());
builder.field("mean", entry.mean());
builder.field(Fields.COUNT, entry.count());
builder.field(Fields.TOTAL, entry.total());
builder.field(Fields.MEAN, entry.mean());
builder.endObject();
}
builder.endArray();

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facets.statistical;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -173,18 +174,31 @@ public class InternalStatisticalFacet implements StatisticalFacet, InternalFacet
return new InternalStatisticalFacet(name, fieldName, min, max, total, sumOfSquares, count);
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString _FIELD = new XContentBuilderString("_field");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString MIN = new XContentBuilderString("min");
static final XContentBuilderString MAX = new XContentBuilderString("max");
static final XContentBuilderString MEAN = new XContentBuilderString("mean");
static final XContentBuilderString SUM_OF_SQUARES = new XContentBuilderString("sum_of_squares");
static final XContentBuilderString VARIANCE = new XContentBuilderString("variance");
static final XContentBuilderString STD_DEVIATION = new XContentBuilderString("std_deviation");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", StatisticalFacetCollectorParser.NAME);
builder.field("_field", fieldName);
builder.field("count", count());
builder.field("total", total());
builder.field("min", min());
builder.field("max", max());
builder.field("mean", mean());
builder.field("sum_of_squares", sumOfSquares());
builder.field("variance", variance());
builder.field("std_deviation", stdDeviation());
builder.field(Fields._TYPE, StatisticalFacetCollectorParser.NAME);
builder.field(Fields._FIELD, fieldName);
builder.field(Fields.COUNT, count());
builder.field(Fields.TOTAL, total());
builder.field(Fields.MIN, min());
builder.field(Fields.MAX, max());
builder.field(Fields.MEAN, mean());
builder.field(Fields.SUM_OF_SQUARES, sumOfSquares());
builder.field(Fields.VARIANCE, variance());
builder.field(Fields.STD_DEVIATION, stdDeviation());
builder.endObject();
}

View File

@ -27,6 +27,7 @@ import org.elasticsearch.common.thread.ThreadLocals;
import org.elasticsearch.common.trove.TObjectIntHashMap;
import org.elasticsearch.common.trove.TObjectIntIterator;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.facets.Facet;
import org.elasticsearch.search.facets.internal.InternalFacet;
@ -138,15 +139,23 @@ public class InternalTermsFacet implements InternalFacet, TermsFacet {
return new InternalTermsFacet(name, fieldName, comparatorType, requiredSize, ordered);
}
static final class Fields {
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString _FIELD = new XContentBuilderString("_field");
static final XContentBuilderString TERMS = new XContentBuilderString("terms");
static final XContentBuilderString TERM = new XContentBuilderString("term");
static final XContentBuilderString COUNT = new XContentBuilderString("count");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(name);
builder.field("_type", TermsFacetCollectorParser.NAME);
builder.field("_field", fieldName);
builder.startArray("terms");
builder.field(Fields._TYPE, TermsFacetCollectorParser.NAME);
builder.field(Fields._FIELD, fieldName);
builder.startArray(Fields.TERMS);
for (Entry entry : entries) {
builder.startObject();
builder.field("term", entry.term());
builder.field("count", entry.count());
builder.field(Fields.TERM, entry.term());
builder.field(Fields.COUNT, entry.count());
builder.endObject();
}
builder.endArray();

View File

@ -28,6 +28,7 @@ import org.elasticsearch.common.compress.lzf.LZFDecoder;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.rest.action.support.RestXContentBuilder;
@ -266,23 +267,38 @@ public class InternalSearchHit implements SearchHit {
return this.matchedFilters;
}
public static class Fields {
static final XContentBuilderString _INDEX = new XContentBuilderString("_index");
static final XContentBuilderString _TYPE = new XContentBuilderString("_type");
static final XContentBuilderString _ID = new XContentBuilderString("_id");
static final XContentBuilderString _SCORE = new XContentBuilderString("_score");
static final XContentBuilderString FIELDS = new XContentBuilderString("fields");
static final XContentBuilderString HIGHLIGHT = new XContentBuilderString("highlight");
static final XContentBuilderString SORT = new XContentBuilderString("sort");
static final XContentBuilderString MATCH_FILTERS = new XContentBuilderString("matched_filters");
static final XContentBuilderString _EXPLANATION = new XContentBuilderString("_explanation");
static final XContentBuilderString VALUE = new XContentBuilderString("value");
static final XContentBuilderString DESCRIPTION = new XContentBuilderString("description");
static final XContentBuilderString DETAILS = new XContentBuilderString("details");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
builder.field("_index", shard.index());
builder.field(Fields._INDEX, shard.index());
// builder.field("_shard", shard.shardId());
// builder.field("_node", shard.nodeId());
builder.field("_type", type());
builder.field("_id", id());
builder.field(Fields._TYPE, type());
builder.field(Fields._ID, id());
if (Float.isNaN(score)) {
builder.nullField("_score");
builder.nullField(Fields._SCORE);
} else {
builder.field("_score", score);
builder.field(Fields._SCORE, score);
}
if (source != null) {
RestXContentBuilder.restDocumentSource(source, builder, params);
}
if (fields != null && !fields.isEmpty()) {
builder.startObject("fields");
builder.startObject(Fields.FIELDS);
for (SearchHitField field : fields.values()) {
if (field.values().isEmpty()) {
continue;
@ -301,7 +317,7 @@ public class InternalSearchHit implements SearchHit {
builder.endObject();
}
if (highlightFields != null && !highlightFields.isEmpty()) {
builder.startObject("highlight");
builder.startObject(Fields.HIGHLIGHT);
for (HighlightField field : highlightFields.values()) {
builder.field(field.name());
if (field.fragments() == null) {
@ -317,21 +333,21 @@ public class InternalSearchHit implements SearchHit {
builder.endObject();
}
if (sortValues != null && sortValues.length > 0) {
builder.startArray("sort");
builder.startArray(Fields.SORT);
for (Object sortValue : sortValues) {
builder.value(sortValue);
}
builder.endArray();
}
if (matchedFilters.length > 0) {
builder.startArray("matched_filters");
builder.startArray(Fields.MATCH_FILTERS);
for (String matchedFilter : matchedFilters) {
builder.value(matchedFilter);
}
builder.endArray();
}
if (explanation() != null) {
builder.field("_explanation");
builder.field(Fields._EXPLANATION);
buildExplanation(builder, explanation());
}
builder.endObject();
@ -339,11 +355,11 @@ public class InternalSearchHit implements SearchHit {
private void buildExplanation(XContentBuilder builder, Explanation explanation) throws IOException {
builder.startObject();
builder.field("value", explanation.getValue());
builder.field("description", explanation.getDescription());
builder.field(Fields.VALUE, explanation.getValue());
builder.field(Fields.DESCRIPTION, explanation.getDescription());
Explanation[] innerExps = explanation.getDetails();
if (innerExps != null) {
builder.startArray("details");
builder.startArray(Fields.DETAILS);
for (Explanation exp : innerExps) {
buildExplanation(builder, exp);
}

View File

@ -25,6 +25,7 @@ import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.thread.ThreadLocals;
import org.elasticsearch.common.trove.TIntObjectHashMap;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.SearchShardTarget;
@ -150,15 +151,21 @@ public class InternalSearchHits implements SearchHits {
return this.hits;
}
static final class Fields {
static final XContentBuilderString HITS = new XContentBuilderString("hits");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString MAX_SCORE = new XContentBuilderString("max_score");
}
@Override public void toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject("hits");
builder.field("total", totalHits);
builder.startObject(Fields.HITS);
builder.field(Fields.TOTAL, totalHits);
if (Float.isNaN(maxScore)) {
builder.nullField("max_score");
builder.nullField(Fields.MAX_SCORE);
} else {
builder.field("max_score", maxScore);
builder.field(Fields.MAX_SCORE, maxScore);
}
builder.field("hits");
builder.field(Fields.HITS);
builder.startArray();
for (SearchHit hit : hits) {
hit.toXContent(builder, params);