Skip to content

Commit

Permalink
Convert all FieldMappers in mapper-extras to parametrized form (#62938)…
Browse files Browse the repository at this point in the history
… (#63034)

This converts RankFeatureFieldMapper, RankFeaturesFieldMapper,
SearchAsYouTypeFieldMapper and TokenCountFieldMapper to
parametrized forms. It also adds a TextParams utility class to core
containing functions that help declare text parameters - mainly shared
between SearchAsYouTypeFieldMapper and KeywordFieldMapper at
the moment, but it will come in handy when we convert TextFieldMapper
and friends.

Relates to #62988
  • Loading branch information
romseygeek committed Sep 29, 2020
1 parent 454aafd commit 2f5a813
Show file tree
Hide file tree
Showing 14 changed files with 451 additions and 492 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ public class MapperExtrasPlugin extends Plugin implements MapperPlugin, SearchPl
public Map<String, Mapper.TypeParser> getMappers() {
Map<String, Mapper.TypeParser> mappers = new LinkedHashMap<>();
mappers.put(ScaledFloatFieldMapper.CONTENT_TYPE, ScaledFloatFieldMapper.PARSER);
mappers.put(TokenCountFieldMapper.CONTENT_TYPE, new TokenCountFieldMapper.TypeParser());
mappers.put(RankFeatureFieldMapper.CONTENT_TYPE, new RankFeatureFieldMapper.TypeParser());
mappers.put(RankFeaturesFieldMapper.CONTENT_TYPE, new RankFeaturesFieldMapper.TypeParser());
mappers.put(SearchAsYouTypeFieldMapper.CONTENT_TYPE, new SearchAsYouTypeFieldMapper.TypeParser());
mappers.put(TokenCountFieldMapper.CONTENT_TYPE, TokenCountFieldMapper.PARSER);
mappers.put(RankFeatureFieldMapper.CONTENT_TYPE, RankFeatureFieldMapper.PARSER);
mappers.put(RankFeaturesFieldMapper.CONTENT_TYPE, RankFeaturesFieldMapper.PARSER);
mappers.put(SearchAsYouTypeFieldMapper.CONTENT_TYPE, SearchAsYouTypeFieldMapper.PARSER);
return Collections.unmodifiableMap(mappers);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,21 @@
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.elasticsearch.common.lucene.Lucene;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser.Token;
import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.index.fielddata.IndexFieldData;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.search.lookup.SearchLookup;

import java.io.IOException;
import java.util.Iterator;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

/**
* A {@link FieldMapper} that exposes Lucene's {@link FeatureField}.
*/
public class RankFeatureFieldMapper extends FieldMapper {
public class RankFeatureFieldMapper extends ParametrizedFieldMapper {

public static final String CONTENT_TYPE = "rank_feature";

Expand All @@ -57,43 +55,34 @@ public static class Defaults {
}
}

public static class Builder extends FieldMapper.Builder<Builder> {
private static RankFeatureFieldType ft(FieldMapper in) {
return ((RankFeatureFieldMapper)in).fieldType();
}

public static class Builder extends ParametrizedFieldMapper.Builder {

private boolean positiveScoreImpact = true;
private final Parameter<Boolean> positiveScoreImpact
= Parameter.boolParam("positive_score_impact", false, m -> ft(m).positiveScoreImpact, true);
private final Parameter<Map<String, String>> meta = Parameter.metaParam();

public Builder(String name) {
super(name, Defaults.FIELD_TYPE);
builder = this;
super(name);
}

public Builder positiveScoreImpact(boolean v) {
this.positiveScoreImpact = v;
return builder;
@Override
protected List<Parameter<?>> getParameters() {
return Arrays.asList(positiveScoreImpact, meta);
}

@Override
public RankFeatureFieldMapper build(BuilderContext context) {
return new RankFeatureFieldMapper(name, fieldType, new RankFeatureFieldType(buildFullName(context), meta, positiveScoreImpact),
multiFieldsBuilder.build(this, context), copyTo, positiveScoreImpact);
return new RankFeatureFieldMapper(name,
new RankFeatureFieldType(buildFullName(context), meta.getValue(), positiveScoreImpact.getValue()),
multiFieldsBuilder.build(this, context), copyTo.build(), positiveScoreImpact.getValue());
}
}

public static class TypeParser implements Mapper.TypeParser {
@Override
public Mapper.Builder<?> parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
RankFeatureFieldMapper.Builder builder = new RankFeatureFieldMapper.Builder(name);
for (Iterator<Map.Entry<String, Object>> iterator = node.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, Object> entry = iterator.next();
String propName = entry.getKey();
Object propNode = entry.getValue();
if (propName.equals("positive_score_impact")) {
builder.positiveScoreImpact(XContentMapValues.nodeBooleanValue(propNode));
iterator.remove();
}
}
return builder;
}
}
public static final TypeParser PARSER = new TypeParser((n, c) -> new Builder(n));

public static final class RankFeatureFieldType extends MappedFieldType {

Expand Down Expand Up @@ -132,10 +121,9 @@ public Query termQuery(Object value, QueryShardContext context) {

private final boolean positiveScoreImpact;

private RankFeatureFieldMapper(String simpleName, FieldType fieldType, MappedFieldType mappedFieldType,
private RankFeatureFieldMapper(String simpleName, MappedFieldType mappedFieldType,
MultiFields multiFields, CopyTo copyTo, boolean positiveScoreImpact) {
super(simpleName, fieldType, mappedFieldType, multiFields, copyTo);
assert fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS) <= 0;
super(simpleName, mappedFieldType, multiFields, copyTo);
this.positiveScoreImpact = positiveScoreImpact;
}

Expand Down Expand Up @@ -201,23 +189,7 @@ protected String contentType() {
}

@Override
protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException {
super.doXContentBody(builder, includeDefaults, params);

if (includeDefaults || positiveScoreImpact == false) {
builder.field("positive_score_impact", positiveScoreImpact);
}
}

@Override
protected boolean docValuesByDefault() {
return false;
}

@Override
protected void mergeOptions(FieldMapper other, List<String> conflicts) {
if (positiveScoreImpact != ((RankFeatureFieldMapper)other).positiveScoreImpact) {
conflicts.add("mapper [" + name() + "] has different [positive_score_impact] values");
}
public ParametrizedFieldMapper.Builder getMergeBuilder() {
return new Builder(simpleName()).init(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package org.elasticsearch.index.mapper;

import org.apache.lucene.document.FeatureField;
import org.apache.lucene.document.FieldType;
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.search.Query;
import org.elasticsearch.common.lucene.Lucene;
Expand All @@ -30,6 +29,7 @@
import org.elasticsearch.search.lookup.SearchLookup;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
Expand All @@ -38,43 +38,34 @@
* A {@link FieldMapper} that exposes Lucene's {@link FeatureField} as a sparse
* vector of features.
*/
public class RankFeaturesFieldMapper extends FieldMapper {
public class RankFeaturesFieldMapper extends ParametrizedFieldMapper {

public static final String CONTENT_TYPE = "rank_features";

public static class Defaults {
public static final FieldType FIELD_TYPE = new FieldType();
public static class Builder extends ParametrizedFieldMapper.Builder {

static {
FIELD_TYPE.setTokenized(false);
FIELD_TYPE.setIndexOptions(IndexOptions.NONE);
FIELD_TYPE.setOmitNorms(true);
FIELD_TYPE.freeze();
}
}

public static class Builder extends FieldMapper.Builder<Builder> {
private final Parameter<Map<String, String>> meta = Parameter.metaParam();

public Builder(String name) {
super(name, Defaults.FIELD_TYPE);
super(name);
builder = this;
}

@Override
public RankFeaturesFieldMapper build(BuilderContext context) {
return new RankFeaturesFieldMapper(
name, fieldType, new RankFeaturesFieldType(buildFullName(context), meta),
multiFieldsBuilder.build(this, context), copyTo);
protected List<Parameter<?>> getParameters() {
return Collections.singletonList(meta);
}
}

public static class TypeParser implements Mapper.TypeParser {
@Override
public Mapper.Builder<?> parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {
return new Builder(name);
public RankFeaturesFieldMapper build(BuilderContext context) {
return new RankFeaturesFieldMapper(
name, new RankFeaturesFieldType(buildFullName(context), meta.getValue()),
multiFieldsBuilder.build(this, context), copyTo.build());
}
}

public static final TypeParser PARSER = new TypeParser((n, c) -> new Builder(n));

public static final class RankFeaturesFieldType extends MappedFieldType {

public RankFeaturesFieldType(String name, Map<String, String> meta) {
Expand Down Expand Up @@ -103,20 +94,20 @@ public Query termQuery(Object value, QueryShardContext context) {
}
}

private RankFeaturesFieldMapper(String simpleName, FieldType fieldType, MappedFieldType mappedFieldType,
private RankFeaturesFieldMapper(String simpleName, MappedFieldType mappedFieldType,
MultiFields multiFields, CopyTo copyTo) {
super(simpleName, fieldType, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, multiFields, copyTo);
assert fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS) <= 0;
}

@Override
protected RankFeaturesFieldMapper clone() {
return (RankFeaturesFieldMapper) super.clone();
public ParametrizedFieldMapper.Builder getMergeBuilder() {
return new Builder(simpleName()).init(this);
}

@Override
protected void mergeOptions(FieldMapper other, List<String> conflicts) {

protected RankFeaturesFieldMapper clone() {
return (RankFeaturesFieldMapper) super.clone();
}

@Override
Expand Down Expand Up @@ -157,7 +148,7 @@ public void parse(ParseContext context) throws IOException {
}

@Override
protected void parseCreateField(ParseContext context) throws IOException {
protected void parseCreateField(ParseContext context) {
throw new AssertionError("parse is implemented directly");
}

Expand All @@ -174,16 +165,6 @@ protected Object parseSourceValue(Object value) {
};
}

@Override
protected boolean indexedByDefault() {
return false;
}

@Override
protected boolean docValuesByDefault() {
return false;
}

@Override
protected String contentType() {
return CONTENT_TYPE;
Expand Down

0 comments on commit 2f5a813

Please sign in to comment.