Addressing review comments

This commit is contained in:
Christoph Büscher 2015-12-09 18:04:58 +01:00
parent cb84b1ff1a
commit e4721fd02a
3 changed files with 40 additions and 23 deletions

View File

@ -33,11 +33,8 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.search.SearchParseException;
import org.elasticsearch.search.highlight.SearchContextHighlight.FieldOptions; import org.elasticsearch.search.highlight.SearchContextHighlight.FieldOptions;
import org.elasticsearch.search.highlight.SearchContextHighlight.FieldOptions.Builder; import org.elasticsearch.search.highlight.SearchContextHighlight.FieldOptions.Builder;
import org.elasticsearch.search.internal.SearchContext;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -84,14 +81,14 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
public static final String[] DEFAULT_POST_TAGS = new String[]{"</em>"}; public static final String[] DEFAULT_POST_TAGS = new String[]{"</em>"};
/** the default opening tags when <tt>tag_schema = "styled"</tt> */ /** the default opening tags when <tt>tag_schema = "styled"</tt> */
public static final String[] STYLED_PRE_TAG = { public static final String[] DEFAULT_STYLED_PRE_TAG = {
"<em class=\"hlt1\">", "<em class=\"hlt2\">", "<em class=\"hlt3\">", "<em class=\"hlt1\">", "<em class=\"hlt2\">", "<em class=\"hlt3\">",
"<em class=\"hlt4\">", "<em class=\"hlt5\">", "<em class=\"hlt6\">", "<em class=\"hlt4\">", "<em class=\"hlt5\">", "<em class=\"hlt6\">",
"<em class=\"hlt7\">", "<em class=\"hlt8\">", "<em class=\"hlt9\">", "<em class=\"hlt7\">", "<em class=\"hlt8\">", "<em class=\"hlt9\">",
"<em class=\"hlt10\">" "<em class=\"hlt10\">"
}; };
/** the default closing tags when <tt>tag_schema = "styled"</tt> */ /** the default closing tags when <tt>tag_schema = "styled"</tt> */
public static final String[] STYLED_POST_TAGS = {"</em>"}; public static final String[] DEFAULT_STYLED_POST_TAGS = {"</em>"};
/** /**
* a {@link FieldOptions.Builder} with default settings * a {@link FieldOptions.Builder} with default settings
@ -181,8 +178,8 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
postTags(DEFAULT_POST_TAGS); postTags(DEFAULT_POST_TAGS);
break; break;
case "styled": case "styled":
preTags(STYLED_PRE_TAG); preTags(DEFAULT_STYLED_PRE_TAG);
postTags(STYLED_POST_TAGS); postTags(DEFAULT_STYLED_POST_TAGS);
break; break;
default: default:
throw new IllegalArgumentException("Unknown tag schema ["+ schemaName +"]"); throw new IllegalArgumentException("Unknown tag schema ["+ schemaName +"]");
@ -346,15 +343,7 @@ public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilde
return highlightBuilder; return highlightBuilder;
} }
public void parse(XContentParser parser, SearchContext context) throws Exception { public SearchContextHighlight build(QueryShardContext context) throws IOException {
try {
context.highlight(build(context.indexShard().getQueryShardContext()));
} catch (IllegalArgumentException ex) {
throw new SearchParseException(context, "Error while trying to parse Highlighter element in request", parser.getTokenLocation());
}
}
SearchContextHighlight build(QueryShardContext context) throws IOException {
// create template global options that are later merged with any partial field options // create template global options that are later merged with any partial field options
final SearchContextHighlight.FieldOptions.Builder globalOptionsBuilder = new SearchContextHighlight.FieldOptions.Builder(); final SearchContextHighlight.FieldOptions.Builder globalOptionsBuilder = new SearchContextHighlight.FieldOptions.Builder();
globalOptionsBuilder.encoder(this.encoder); globalOptionsBuilder.encoder(this.encoder);

View File

@ -108,8 +108,8 @@ public class HighlighterParseElement implements SearchParseElement {
} else if ("tags_schema".equals(topLevelFieldName) || "tagsSchema".equals(topLevelFieldName)) { } else if ("tags_schema".equals(topLevelFieldName) || "tagsSchema".equals(topLevelFieldName)) {
String schema = parser.text(); String schema = parser.text();
if ("styled".equals(schema)) { if ("styled".equals(schema)) {
globalOptionsBuilder.preTags(HighlightBuilder.STYLED_PRE_TAG); globalOptionsBuilder.preTags(HighlightBuilder.DEFAULT_STYLED_PRE_TAG);
globalOptionsBuilder.postTags(HighlightBuilder.STYLED_POST_TAGS); globalOptionsBuilder.postTags(HighlightBuilder.DEFAULT_STYLED_POST_TAGS);
} }
} else if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) { } else if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
globalOptionsBuilder.highlightFilter(parser.booleanValue()); globalOptionsBuilder.highlightFilter(parser.booleanValue());

View File

@ -36,6 +36,13 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.Index; import org.elasticsearch.index.Index;
import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexSettings;
import org.elasticsearch.index.mapper.ContentPath;
import org.elasticsearch.index.mapper.MappedFieldType;
import org.elasticsearch.index.mapper.Mapper;
import org.elasticsearch.index.mapper.MapperBuilders;
import org.elasticsearch.index.mapper.core.StringFieldMapper;
import org.elasticsearch.index.query.IdsQueryBuilder;
import org.elasticsearch.index.query.IdsQueryParser;
import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.MatchAllQueryParser; import org.elasticsearch.index.query.MatchAllQueryParser;
import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilder;
@ -43,6 +50,7 @@ import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.index.query.QueryParser; import org.elasticsearch.index.query.QueryParser;
import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.index.query.TermQueryParser;
import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.search.highlight.HighlightBuilder; import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.highlight.HighlightBuilder.Field; import org.elasticsearch.search.highlight.HighlightBuilder.Field;
@ -79,6 +87,8 @@ public class HighlightBuilderTests extends ESTestCase {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
Set<QueryParser> injectedQueryParsers = new HashSet<>(); Set<QueryParser> injectedQueryParsers = new HashSet<>();
injectedQueryParsers.add(new MatchAllQueryParser()); injectedQueryParsers.add(new MatchAllQueryParser());
injectedQueryParsers.add(new IdsQueryParser());
injectedQueryParsers.add(new TermQueryParser());
indicesQueriesRegistry = new IndicesQueriesRegistry(Settings.settingsBuilder().build(), injectedQueryParsers, namedWriteableRegistry); indicesQueriesRegistry = new IndicesQueriesRegistry(Settings.settingsBuilder().build(), injectedQueryParsers, namedWriteableRegistry);
} }
@ -277,7 +287,14 @@ public class HighlightBuilderTests extends ESTestCase {
Index index = new Index(randomAsciiOfLengthBetween(1, 10)); Index index = new Index(randomAsciiOfLengthBetween(1, 10));
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings(index, indexSettings); IndexSettings idxSettings = IndexSettingsModule.newIndexSettings(index, indexSettings);
// shard context will only need indicesQueriesRegistry for building Query objects nested in highlighter // shard context will only need indicesQueriesRegistry for building Query objects nested in highlighter
QueryShardContext mockShardContext = new QueryShardContext(idxSettings, null, null, null, null, null, null, indicesQueriesRegistry); QueryShardContext mockShardContext = new QueryShardContext(idxSettings, null, null, null, null, null, null, indicesQueriesRegistry) {
@Override
public MappedFieldType fieldMapper(String name) {
StringFieldMapper.Builder builder = MapperBuilders.stringField(name);
return builder.build(new Mapper.BuilderContext(idxSettings.getSettings(), new ContentPath(1))).fieldType();
}
};
mockShardContext.setMapUnmappedFieldAsString(true);
for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) { for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) {
HighlightBuilder highlightBuilder = randomHighlighterBuilder(); HighlightBuilder highlightBuilder = randomHighlighterBuilder();
@ -338,9 +355,9 @@ public class HighlightBuilderTests extends ESTestCase {
context.reset(parser); context.reset(parser);
HighlightBuilder highlightBuilder = HighlightBuilder.fromXContent(context); HighlightBuilder highlightBuilder = HighlightBuilder.fromXContent(context);
assertArrayEquals("setting tags_schema 'styled' should alter pre_tags", HighlightBuilder.STYLED_PRE_TAG, assertArrayEquals("setting tags_schema 'styled' should alter pre_tags", HighlightBuilder.DEFAULT_STYLED_PRE_TAG,
highlightBuilder.preTags()); highlightBuilder.preTags());
assertArrayEquals("setting tags_schema 'styled' should alter post_tags", HighlightBuilder.STYLED_POST_TAGS, assertArrayEquals("setting tags_schema 'styled' should alter post_tags", HighlightBuilder.DEFAULT_STYLED_POST_TAGS,
highlightBuilder.postTags()); highlightBuilder.postTags());
highlightElement = "{\n" + highlightElement = "{\n" +
@ -423,9 +440,20 @@ public class HighlightBuilderTests extends ESTestCase {
highlightBuilder.fragmenter(randomAsciiOfLengthBetween(1, 10)); highlightBuilder.fragmenter(randomAsciiOfLengthBetween(1, 10));
} }
if (randomBoolean()) { if (randomBoolean()) {
QueryBuilder highlightQuery = new MatchAllQueryBuilder(); QueryBuilder highlightQuery;
switch (randomInt(2)) {
case 0:
highlightQuery = new MatchAllQueryBuilder();
break;
case 1:
highlightQuery = new IdsQueryBuilder();
break;
default:
case 2:
highlightQuery = new TermQueryBuilder(randomAsciiOfLengthBetween(1, 10), randomAsciiOfLengthBetween(1, 10));
break;
}
highlightQuery.boost((float) randomDoubleBetween(0, 10, false)); highlightQuery.boost((float) randomDoubleBetween(0, 10, false));
highlightQuery.queryName(randomAsciiOfLength(10));
highlightBuilder.highlightQuery(highlightQuery); highlightBuilder.highlightQuery(highlightQuery);
} }
if (randomBoolean()) { if (randomBoolean()) {