Remove PROTOTYPEs from highlighting
This commit is contained in:
parent
9d68a515b8
commit
d919031469
|
@ -166,7 +166,7 @@ public final class InnerHitBuilder extends ToXContentToBytes implements Writeabl
|
||||||
sorts.add(in.readSortBuilder());
|
sorts.add(in.readSortBuilder());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
highlightBuilder = in.readOptionalWriteable(HighlightBuilder.PROTOTYPE::readFrom);
|
highlightBuilder = in.readOptionalWriteable(HighlightBuilder::new);
|
||||||
query = in.readQuery();
|
query = in.readQuery();
|
||||||
innerHitsBuilder = in.readOptionalWriteable(InnerHitsBuilder.PROTO::readFrom);
|
innerHitsBuilder = in.readOptionalWriteable(InnerHitsBuilder.PROTO::readFrom);
|
||||||
}
|
}
|
||||||
|
|
|
@ -538,9 +538,7 @@ public class TopHitsAggregatorBuilder extends AggregatorBuilder<TopHitsAggregato
|
||||||
factory.fieldNames = fieldNames;
|
factory.fieldNames = fieldNames;
|
||||||
}
|
}
|
||||||
factory.from = in.readVInt();
|
factory.from = in.readVInt();
|
||||||
if (in.readBoolean()) {
|
in.readOptionalWriteable(HighlightBuilder::new);
|
||||||
factory.highlightBuilder = HighlightBuilder.PROTOTYPE.readFrom(in);
|
|
||||||
}
|
|
||||||
if (in.readBoolean()) {
|
if (in.readBoolean()) {
|
||||||
int size = in.readVInt();
|
int size = in.readVInt();
|
||||||
List<ScriptField> scriptFields = new ArrayList<>(size);
|
List<ScriptField> scriptFields = new ArrayList<>(size);
|
||||||
|
@ -584,11 +582,7 @@ public class TopHitsAggregatorBuilder extends AggregatorBuilder<TopHitsAggregato
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.writeVInt(from);
|
out.writeVInt(from);
|
||||||
boolean hasHighlighter = highlightBuilder != null;
|
out.writeOptionalWriteable(highlightBuilder);
|
||||||
out.writeBoolean(hasHighlighter);
|
|
||||||
if (hasHighlighter) {
|
|
||||||
highlightBuilder.writeTo(out);
|
|
||||||
}
|
|
||||||
boolean hasScriptFields = scriptFields != null;
|
boolean hasScriptFields = scriptFields != null;
|
||||||
out.writeBoolean(hasScriptFields);
|
out.writeBoolean(hasScriptFields);
|
||||||
if (hasScriptFields) {
|
if (hasScriptFields) {
|
||||||
|
|
|
@ -1216,9 +1216,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
|
||||||
builder.fieldNames = fieldNames;
|
builder.fieldNames = fieldNames;
|
||||||
}
|
}
|
||||||
builder.from = in.readVInt();
|
builder.from = in.readVInt();
|
||||||
if (in.readBoolean()) {
|
builder.highlightBuilder = in.readOptionalWriteable(HighlightBuilder::new);
|
||||||
builder.highlightBuilder = HighlightBuilder.PROTOTYPE.readFrom(in);
|
|
||||||
}
|
|
||||||
boolean hasIndexBoost = in.readBoolean();
|
boolean hasIndexBoost = in.readBoolean();
|
||||||
if (hasIndexBoost) {
|
if (hasIndexBoost) {
|
||||||
int size = in.readVInt();
|
int size = in.readVInt();
|
||||||
|
@ -1320,11 +1318,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.writeVInt(from);
|
out.writeVInt(from);
|
||||||
boolean hasHighlightBuilder = highlightBuilder != null;
|
out.writeOptionalWriteable(highlightBuilder);
|
||||||
out.writeBoolean(hasHighlightBuilder);
|
|
||||||
if (hasHighlightBuilder) {
|
|
||||||
highlightBuilder.writeTo(out);
|
|
||||||
}
|
|
||||||
boolean hasIndexBoost = indexBoost != null;
|
boolean hasIndexBoost = indexBoost != null;
|
||||||
out.writeBoolean(hasIndexBoost);
|
out.writeBoolean(hasIndexBoost);
|
||||||
if (hasIndexBoost) {
|
if (hasIndexBoost) {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.elasticsearch.common.ParseField;
|
||||||
import org.elasticsearch.common.ParsingException;
|
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.io.stream.Writeable;
|
||||||
import org.elasticsearch.common.xcontent.ObjectParser;
|
import org.elasticsearch.common.xcontent.ObjectParser;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
@ -45,8 +46,8 @@ import static org.elasticsearch.common.xcontent.ObjectParser.fromList;
|
||||||
* This abstract class holds parameters shared by {@link HighlightBuilder} and {@link HighlightBuilder.Field}
|
* This abstract class holds parameters shared by {@link HighlightBuilder} and {@link HighlightBuilder.Field}
|
||||||
* and provides the common setters, equality, hashCode calculation and common serialization
|
* and provides the common setters, equality, hashCode calculation and common serialization
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterBuilder<?>> extends ToXContentToBytes {
|
public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterBuilder<?>> extends ToXContentToBytes
|
||||||
|
implements Writeable<HB> {
|
||||||
public static final ParseField PRE_TAGS_FIELD = new ParseField("pre_tags");
|
public static final ParseField PRE_TAGS_FIELD = new ParseField("pre_tags");
|
||||||
public static final ParseField POST_TAGS_FIELD = new ParseField("post_tags");
|
public static final ParseField POST_TAGS_FIELD = new ParseField("post_tags");
|
||||||
public static final ParseField FIELDS_FIELD = new ParseField("fields");
|
public static final ParseField FIELDS_FIELD = new ParseField("fields");
|
||||||
|
@ -100,6 +101,75 @@ public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterB
|
||||||
|
|
||||||
protected Boolean requireFieldMatch;
|
protected Boolean requireFieldMatch;
|
||||||
|
|
||||||
|
public AbstractHighlighterBuilder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read from a stream.
|
||||||
|
*/
|
||||||
|
protected AbstractHighlighterBuilder(StreamInput in) throws IOException {
|
||||||
|
preTags(in.readOptionalStringArray());
|
||||||
|
postTags(in.readOptionalStringArray());
|
||||||
|
fragmentSize(in.readOptionalVInt());
|
||||||
|
numOfFragments(in.readOptionalVInt());
|
||||||
|
highlighterType(in.readOptionalString());
|
||||||
|
fragmenter(in.readOptionalString());
|
||||||
|
if (in.readBoolean()) {
|
||||||
|
highlightQuery(in.readQuery());
|
||||||
|
}
|
||||||
|
order(in.readOptionalWriteable(Order::readFromStream));
|
||||||
|
highlightFilter(in.readOptionalBoolean());
|
||||||
|
forceSource(in.readOptionalBoolean());
|
||||||
|
boundaryMaxScan(in.readOptionalVInt());
|
||||||
|
if (in.readBoolean()) {
|
||||||
|
boundaryChars(in.readString().toCharArray());
|
||||||
|
}
|
||||||
|
noMatchSize(in.readOptionalVInt());
|
||||||
|
phraseLimit(in.readOptionalVInt());
|
||||||
|
if (in.readBoolean()) {
|
||||||
|
options(in.readMap());
|
||||||
|
}
|
||||||
|
requireFieldMatch(in.readOptionalBoolean());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write common parameters to {@link StreamOutput}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public final void writeTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeOptionalStringArray(preTags);
|
||||||
|
out.writeOptionalStringArray(postTags);
|
||||||
|
out.writeOptionalVInt(fragmentSize);
|
||||||
|
out.writeOptionalVInt(numOfFragments);
|
||||||
|
out.writeOptionalString(highlighterType);
|
||||||
|
out.writeOptionalString(fragmenter);
|
||||||
|
boolean hasQuery = highlightQuery != null;
|
||||||
|
out.writeBoolean(hasQuery);
|
||||||
|
if (hasQuery) {
|
||||||
|
out.writeQuery(highlightQuery);
|
||||||
|
}
|
||||||
|
out.writeOptionalWriteable(order);
|
||||||
|
out.writeOptionalBoolean(highlightFilter);
|
||||||
|
out.writeOptionalBoolean(forceSource);
|
||||||
|
out.writeOptionalVInt(boundaryMaxScan);
|
||||||
|
boolean hasBounaryChars = boundaryChars != null;
|
||||||
|
out.writeBoolean(hasBounaryChars);
|
||||||
|
if (hasBounaryChars) {
|
||||||
|
out.writeString(String.valueOf(boundaryChars));
|
||||||
|
}
|
||||||
|
out.writeOptionalVInt(noMatchSize);
|
||||||
|
out.writeOptionalVInt(phraseLimit);
|
||||||
|
boolean hasOptions = options != null;
|
||||||
|
out.writeBoolean(hasOptions);
|
||||||
|
if (hasOptions) {
|
||||||
|
out.writeMap(options);
|
||||||
|
}
|
||||||
|
out.writeOptionalBoolean(requireFieldMatch);
|
||||||
|
doWriteTo(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void doWriteTo(StreamOutput out) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the pre tags that will be used for highlighting.
|
* Set the pre tags that will be used for highlighting.
|
||||||
*/
|
*/
|
||||||
|
@ -535,74 +605,4 @@ public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterB
|
||||||
* fields only present in subclass should be checked for equality in the implementation
|
* fields only present in subclass should be checked for equality in the implementation
|
||||||
*/
|
*/
|
||||||
protected abstract boolean doEquals(HB other);
|
protected abstract boolean doEquals(HB other);
|
||||||
|
|
||||||
/**
|
|
||||||
* read common parameters from {@link StreamInput}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
protected HB readOptionsFrom(StreamInput in) throws IOException {
|
|
||||||
preTags(in.readOptionalStringArray());
|
|
||||||
postTags(in.readOptionalStringArray());
|
|
||||||
fragmentSize(in.readOptionalVInt());
|
|
||||||
numOfFragments(in.readOptionalVInt());
|
|
||||||
highlighterType(in.readOptionalString());
|
|
||||||
fragmenter(in.readOptionalString());
|
|
||||||
if (in.readBoolean()) {
|
|
||||||
highlightQuery(in.readQuery());
|
|
||||||
}
|
|
||||||
if (in.readBoolean()) {
|
|
||||||
order(Order.PROTOTYPE.readFrom(in));
|
|
||||||
}
|
|
||||||
highlightFilter(in.readOptionalBoolean());
|
|
||||||
forceSource(in.readOptionalBoolean());
|
|
||||||
boundaryMaxScan(in.readOptionalVInt());
|
|
||||||
if (in.readBoolean()) {
|
|
||||||
boundaryChars(in.readString().toCharArray());
|
|
||||||
}
|
|
||||||
noMatchSize(in.readOptionalVInt());
|
|
||||||
phraseLimit(in.readOptionalVInt());
|
|
||||||
if (in.readBoolean()) {
|
|
||||||
options(in.readMap());
|
|
||||||
}
|
|
||||||
requireFieldMatch(in.readOptionalBoolean());
|
|
||||||
return (HB) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* write common parameters to {@link StreamOutput}
|
|
||||||
*/
|
|
||||||
protected void writeOptionsTo(StreamOutput out) throws IOException {
|
|
||||||
out.writeOptionalStringArray(preTags);
|
|
||||||
out.writeOptionalStringArray(postTags);
|
|
||||||
out.writeOptionalVInt(fragmentSize);
|
|
||||||
out.writeOptionalVInt(numOfFragments);
|
|
||||||
out.writeOptionalString(highlighterType);
|
|
||||||
out.writeOptionalString(fragmenter);
|
|
||||||
boolean hasQuery = highlightQuery != null;
|
|
||||||
out.writeBoolean(hasQuery);
|
|
||||||
if (hasQuery) {
|
|
||||||
out.writeQuery(highlightQuery);
|
|
||||||
}
|
|
||||||
boolean hasSetOrder = order != null;
|
|
||||||
out.writeBoolean(hasSetOrder);
|
|
||||||
if (hasSetOrder) {
|
|
||||||
order.writeTo(out);
|
|
||||||
}
|
|
||||||
out.writeOptionalBoolean(highlightFilter);
|
|
||||||
out.writeOptionalBoolean(forceSource);
|
|
||||||
out.writeOptionalVInt(boundaryMaxScan);
|
|
||||||
boolean hasBounaryChars = boundaryChars != null;
|
|
||||||
out.writeBoolean(hasBounaryChars);
|
|
||||||
if (hasBounaryChars) {
|
|
||||||
out.writeString(String.valueOf(boundaryChars));
|
|
||||||
}
|
|
||||||
out.writeOptionalVInt(noMatchSize);
|
|
||||||
out.writeOptionalVInt(phraseLimit);
|
|
||||||
boolean hasOptions = options != null;
|
|
||||||
out.writeBoolean(hasOptions);
|
|
||||||
if (hasOptions) {
|
|
||||||
out.writeMap(options);
|
|
||||||
}
|
|
||||||
out.writeOptionalBoolean(requireFieldMatch);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,10 +60,7 @@ import static org.elasticsearch.common.xcontent.ObjectParser.fromList;
|
||||||
*
|
*
|
||||||
* @see org.elasticsearch.search.builder.SearchSourceBuilder#highlight()
|
* @see org.elasticsearch.search.builder.SearchSourceBuilder#highlight()
|
||||||
*/
|
*/
|
||||||
public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilder> implements Writeable<HighlightBuilder> {
|
public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilder> {
|
||||||
|
|
||||||
public static final HighlightBuilder PROTOTYPE = new HighlightBuilder();
|
|
||||||
|
|
||||||
/** default for whether to highlight fields based on the source even if stored separately */
|
/** default for whether to highlight fields based on the source even if stored separately */
|
||||||
public static final boolean DEFAULT_FORCE_SOURCE = false;
|
public static final boolean DEFAULT_FORCE_SOURCE = false;
|
||||||
/** default for whether a field should be highlighted only if a query matches that field */
|
/** default for whether a field should be highlighted only if a query matches that field */
|
||||||
|
@ -114,6 +111,32 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
|
||||||
|
|
||||||
private boolean useExplicitFieldOrder = false;
|
private boolean useExplicitFieldOrder = false;
|
||||||
|
|
||||||
|
public HighlightBuilder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read from a stream.
|
||||||
|
*/
|
||||||
|
public HighlightBuilder(StreamInput in) throws IOException {
|
||||||
|
super(in);
|
||||||
|
encoder(in.readOptionalString());
|
||||||
|
useExplicitFieldOrder(in.readBoolean());
|
||||||
|
int fields = in.readVInt();
|
||||||
|
for (int i = 0; i < fields; i++) {
|
||||||
|
field(new Field(in));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doWriteTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeOptionalString(encoder);
|
||||||
|
out.writeBoolean(useExplicitFieldOrder);
|
||||||
|
out.writeVInt(fields.size());
|
||||||
|
for (int i = 0; i < fields.size(); i++) {
|
||||||
|
fields.get(i).writeTo(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a field to be highlighted with default fragment size of 100 characters, and
|
* Adds a field to be highlighted with default fragment size of 100 characters, and
|
||||||
* default number of fragments of 5 using the default encoder
|
* default number of fragments of 5 using the default encoder
|
||||||
|
@ -393,32 +416,7 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
|
||||||
Objects.equals(fields, other.fields);
|
Objects.equals(fields, other.fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public static class Field extends AbstractHighlighterBuilder<Field> {
|
||||||
public HighlightBuilder readFrom(StreamInput in) throws IOException {
|
|
||||||
HighlightBuilder highlightBuilder = new HighlightBuilder();
|
|
||||||
highlightBuilder.readOptionsFrom(in)
|
|
||||||
.encoder(in.readOptionalString())
|
|
||||||
.useExplicitFieldOrder(in.readBoolean());
|
|
||||||
int fields = in.readVInt();
|
|
||||||
for (int i = 0; i < fields; i++) {
|
|
||||||
highlightBuilder.field(Field.PROTOTYPE.readFrom(in));
|
|
||||||
}
|
|
||||||
return highlightBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
|
||||||
writeOptionsTo(out);
|
|
||||||
out.writeOptionalString(encoder);
|
|
||||||
out.writeBoolean(useExplicitFieldOrder);
|
|
||||||
out.writeVInt(fields.size());
|
|
||||||
for (int i = 0; i < fields.size(); i++) {
|
|
||||||
fields.get(i).writeTo(out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Field extends AbstractHighlighterBuilder<Field> implements Writeable<Field> {
|
|
||||||
static final Field PROTOTYPE = new Field("_na_");
|
|
||||||
static final NamedObjectParser<Field, QueryParseContext> PARSER;
|
static final NamedObjectParser<Field, QueryParseContext> PARSER;
|
||||||
static {
|
static {
|
||||||
ObjectParser<Field, QueryParseContext> parser = new ObjectParser<>("highlight_field");
|
ObjectParser<Field, QueryParseContext> parser = new ObjectParser<>("highlight_field");
|
||||||
|
@ -438,6 +436,23 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read from a stream.
|
||||||
|
*/
|
||||||
|
public Field(StreamInput in) throws IOException {
|
||||||
|
super(in);
|
||||||
|
name = in.readString();
|
||||||
|
fragmentOffset(in.readVInt());
|
||||||
|
matchedFields(in.readOptionalStringArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doWriteTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeString(name);
|
||||||
|
out.writeVInt(fragmentOffset);
|
||||||
|
out.writeOptionalStringArray(matchedFields);
|
||||||
|
}
|
||||||
|
|
||||||
public String name() {
|
public String name() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -483,32 +498,12 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
|
||||||
Objects.equals(fragmentOffset, other.fragmentOffset) &&
|
Objects.equals(fragmentOffset, other.fragmentOffset) &&
|
||||||
Arrays.equals(matchedFields, other.matchedFields);
|
Arrays.equals(matchedFields, other.matchedFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Field readFrom(StreamInput in) throws IOException {
|
|
||||||
Field field = new Field(in.readString());
|
|
||||||
field.fragmentOffset(in.readVInt());
|
|
||||||
field.matchedFields(in.readOptionalStringArray());
|
|
||||||
field.readOptionsFrom(in);
|
|
||||||
return field;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
|
||||||
out.writeString(name);
|
|
||||||
out.writeVInt(fragmentOffset);
|
|
||||||
out.writeOptionalStringArray(matchedFields);
|
|
||||||
writeOptionsTo(out);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Order implements Writeable<Order> {
|
public enum Order implements Writeable<Order> {
|
||||||
NONE, SCORE;
|
NONE, SCORE;
|
||||||
|
|
||||||
static Order PROTOTYPE = NONE;
|
public static Order readFromStream(StreamInput in) throws IOException {
|
||||||
|
|
||||||
@Override
|
|
||||||
public Order readFrom(StreamInput in) throws IOException {
|
|
||||||
int ordinal = in.readVInt();
|
int ordinal = in.readVInt();
|
||||||
if (ordinal < 0 || ordinal >= values().length) {
|
if (ordinal < 0 || ordinal >= values().length) {
|
||||||
throw new IOException("Unknown Order ordinal [" + ordinal + "]");
|
throw new IOException("Unknown Order ordinal [" + ordinal + "]");
|
||||||
|
|
|
@ -744,7 +744,7 @@ public class HighlightBuilderTests extends ESTestCase {
|
||||||
try (BytesStreamOutput output = new BytesStreamOutput()) {
|
try (BytesStreamOutput output = new BytesStreamOutput()) {
|
||||||
original.writeTo(output);
|
original.writeTo(output);
|
||||||
try (StreamInput in = new NamedWriteableAwareStreamInput(StreamInput.wrap(output.bytes()), namedWriteableRegistry)) {
|
try (StreamInput in = new NamedWriteableAwareStreamInput(StreamInput.wrap(output.bytes()), namedWriteableRegistry)) {
|
||||||
return HighlightBuilder.PROTOTYPE.readFrom(in);
|
return new HighlightBuilder(in);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue