Skip to content

Commit

Permalink
Fixed highlighting inconsistencies between REST and Java api
Browse files Browse the repository at this point in the history
Exposed HighlightBuilder missing global options in Java API: fragmentSize, numOfFragments, highlightFilter, boundaryMaxScan and boundaryChars
Exposed SearchRequestBuilder missing global options shortcuts: setHighlighterFragmentSize, setHighlighterNumOfFragments, setHighlighterFilter, setHighlighterBoundaryMaxScan, setHighlighterBoundaryChars, setHighlighterFragmenter, setHighlighterPhraseLimit & setHighlighterForceSource

Closes #5281
  • Loading branch information
javanna committed Mar 28, 2014
1 parent 7354764 commit 5665ea9
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 18 deletions.
Expand Up @@ -706,6 +706,29 @@ public SearchRequestBuilder setHighlighterTagsSchema(String schemaName) {
return this;
}

public SearchRequestBuilder setHighlighterFragmentSize(Integer fragmentSize) {
highlightBuilder().fragmentSize(fragmentSize);
return this;
}

public SearchRequestBuilder setHighlighterNumOfFragments(Integer numOfFragments) {
highlightBuilder().numOfFragments(numOfFragments);
return this;
}

public SearchRequestBuilder setHighlighterFilter(Boolean highlightFilter) {
highlightBuilder().highlightFilter(highlightFilter);
return this;
}

/**
* The encoder to set for highlighting
*/
public SearchRequestBuilder setHighlighterEncoder(String encoder) {
highlightBuilder().encoder(encoder);
return this;
}

/**
* Explicitly set the pre tags that will be used for highlighting.
*/
Expand All @@ -732,25 +755,18 @@ public SearchRequestBuilder setHighlighterOrder(String order) {
return this;
}


/**
* The encoder to set for highlighting
*/
public SearchRequestBuilder setHighlighterEncoder(String encoder) {
highlightBuilder().encoder(encoder);
public SearchRequestBuilder setHighlighterRequireFieldMatch(boolean requireFieldMatch) {
highlightBuilder().requireFieldMatch(requireFieldMatch);
return this;
}

/**
* Sets a query to be used for highlighting all fields instead of the search query.
*/
public SearchRequestBuilder setHighlighterQuery(QueryBuilder highlightQuery) {
highlightBuilder().highlightQuery(highlightQuery);
public SearchRequestBuilder setHighlighterBoundaryMaxScan(Integer boundaryMaxScan) {
highlightBuilder().boundaryMaxScan(boundaryMaxScan);
return this;
}

public SearchRequestBuilder setHighlighterRequireFieldMatch(boolean requireFieldMatch) {
highlightBuilder().requireFieldMatch(requireFieldMatch);
public SearchRequestBuilder setHighlighterBoundaryChars(char[] boundaryChars) {
highlightBuilder().boundaryChars(boundaryChars);
return this;
}

Expand All @@ -762,6 +778,19 @@ public SearchRequestBuilder setHighlighterType(String type) {
return this;
}

public SearchRequestBuilder setHighlighterFragmenter(String fragmenter) {
highlightBuilder().fragmenter(fragmenter);
return this;
}

/**
* Sets a query to be used for highlighting all fields instead of the search query.
*/
public SearchRequestBuilder setHighlighterQuery(QueryBuilder highlightQuery) {
highlightBuilder().highlightQuery(highlightQuery);
return this;
}

/**
* Sets the size of the fragment to return from the beginning of the field if there are no matches to
* highlight and the field doesn't also define noMatchSize.
Expand All @@ -773,11 +802,27 @@ public SearchRequestBuilder setHighlighterNoMatchSize(Integer noMatchSize) {
return this;
}

/**
* Sets the maximum number of phrases the fvh will consider if the field doesn't also define phraseLimit.
*/
public SearchRequestBuilder setHighlighterPhraseLimit(Integer phraseLimit) {
highlightBuilder().phraseLimit(phraseLimit);
return this;
}

public SearchRequestBuilder setHighlighterOptions(Map<String, Object> options) {
highlightBuilder().options(options);
return this;
}

/**
* Forces to highlight fields based on the source even if fields are stored separately.
*/
public SearchRequestBuilder setHighlighterForceSource(Boolean forceSource) {
highlightBuilder().forceSource(forceSource);
return this;
}

/**
* Delegates to {@link org.elasticsearch.search.suggest.SuggestBuilder#setText(String)}.
*/
Expand Down
Expand Up @@ -40,6 +40,12 @@ public class HighlightBuilder implements ToXContent {

private String tagsSchema;

private Boolean highlightFilter;

private Integer fragmentSize;

private Integer numOfFragments;

private String[] preTags;

private String[] postTags;
Expand All @@ -50,6 +56,10 @@ public class HighlightBuilder implements ToXContent {

private Boolean requireFieldMatch;

private Integer boundaryMaxScan;

private char[] boundaryChars;

private String highlighterType;

private String fragmenter;
Expand Down Expand Up @@ -149,6 +159,20 @@ public HighlightBuilder tagsSchema(String schemaName) {
return this;
}

public HighlightBuilder highlightFilter(boolean highlightFilter) {
this.highlightFilter = highlightFilter;
return this;
}

public HighlightBuilder fragmentSize(Integer fragmentSize) {
this.fragmentSize = fragmentSize;
return this;
}

public HighlightBuilder numOfFragments(Integer numOfFragments) {
this.numOfFragments = numOfFragments;
return this;
}

/**
* Set encoder for the highlighting
Expand Down Expand Up @@ -192,6 +216,16 @@ public HighlightBuilder requireFieldMatch(boolean requireFieldMatch) {
return this;
}

public HighlightBuilder boundaryMaxScan(Integer boundaryMaxScan) {
this.boundaryMaxScan = boundaryMaxScan;
return this;
}

public HighlightBuilder boundaryChars(char[] boundaryChars) {
this.boundaryChars = boundaryChars;
return this;
}

/**
* Set type of highlighter to use. Supported types
* are <tt>highlighter</tt>, <tt>fast-vector-highlighter</tt> and <tt>postings-highlighter</tt>.
Expand Down Expand Up @@ -270,12 +304,27 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
if (order != null) {
builder.field("order", order);
}
if (highlightFilter != null) {
builder.field("highlight_filter", highlightFilter);
}
if (fragmentSize != null) {
builder.field("fragment_size", fragmentSize);
}
if (numOfFragments != null) {
builder.field("number_of_fragments", numOfFragments);
}
if (encoder != null) {
builder.field("encoder", encoder);
}
if (requireFieldMatch != null) {
builder.field("require_field_match", requireFieldMatch);
}
if (boundaryMaxScan != null) {
builder.field("boundary_max_scan", boundaryMaxScan);
}
if (boundaryChars != null) {
builder.field("boundary_chars", boundaryChars);
}
if (highlighterType != null) {
builder.field("type", highlighterType);
}
Expand Down
Expand Up @@ -486,20 +486,22 @@ public void testGlobalHighlightingSettingsOverriddenAtFieldLevel() {
ensureGreen();

client().prepareIndex("test", "type1")
.setSource("field1", "this is a test", "field2", "this is another test").get();
.setSource("field1", new String[]{"this is a test", "this is the second test"},
"field2", new String[]{"this is another test", "yet another test"}).get();
refresh();

logger.info("--> highlighting and searching on field1 and field2 produces different tags");
SearchSourceBuilder source = searchSource()
.query(termQuery("field1", "test"))
.from(0).size(60).explain(true)
.highlight(highlight().order("score").preTags("<global>").postTags("</global>")
.field(new HighlightBuilder.Field("field1"))
.field(new HighlightBuilder.Field("field2").preTags("<field2>").postTags("</field2>")));
.highlight(highlight().order("score").preTags("<global>").postTags("</global>").fragmentSize(1).numOfFragments(1)
.field(new HighlightBuilder.Field("field1").numOfFragments(2))
.field(new HighlightBuilder.Field("field2").preTags("<field2>").postTags("</field2>").fragmentSize(50)));

SearchResponse searchResponse = client().search(searchRequest("test").source(source).searchType(QUERY_THEN_FETCH)).actionGet();

assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("this is a <global>test</global>"));
assertHighlight(searchResponse, 0, "field1", 0, 2, equalTo(" <global>test</global>"));
assertHighlight(searchResponse, 0, "field1", 1, 2, equalTo(" <global>test</global>"));
assertHighlight(searchResponse, 0, "field2", 0, 1, equalTo("this is another <field2>test</field2>"));
}

Expand Down

0 comments on commit 5665ea9

Please sign in to comment.