mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-22 12:56:53 +00:00
percolator: Rename map_unmapped_fields_as_string setting to map_unmapped_fields_as_text
The `index.percolator.map_unmapped_fields_as_text` is a more better name, because unmapped fields are mapped to a text field with default settings and string is no longer a field type (it is either keyword or text).
This commit is contained in:
parent
3706a16baf
commit
a4d5c6418e
@ -495,9 +495,9 @@ Otherwise percolate queries can be parsed incorrectly.
|
||||
In certain cases it is unknown what kind of percolator queries do get registered, and if no field mapping exists for fields
|
||||
that are referred by percolator queries then adding a percolator query fails. This means the mapping needs to be updated
|
||||
to have the field with the appropriate settings, and then the percolator query can be added. But sometimes it is sufficient
|
||||
if all unmapped fields are handled as if these were default string fields. In those cases one can configure the
|
||||
`index.percolator.map_unmapped_fields_as_string` setting to `true` (default to `false`) and then if a field referred in
|
||||
a percolator query does not exist, it will be handled as a default string field so that adding the percolator query doesn't
|
||||
if all unmapped fields are handled as if these were default text fields. In those cases one can configure the
|
||||
`index.percolator.map_unmapped_fields_as_text` setting to `true` (default to `false`) and then if a field referred in
|
||||
a percolator query does not exist, it will be handled as a default text field so that adding the percolator query doesn't
|
||||
fail.
|
||||
|
||||
[float]
|
||||
|
@ -62,6 +62,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.common.xcontent.XContentType;
|
||||
import org.elasticsearch.index.IndexSettings;
|
||||
import org.elasticsearch.index.analysis.FieldNameAnalyzer;
|
||||
import org.elasticsearch.index.fielddata.IndexFieldData;
|
||||
import org.elasticsearch.index.fielddata.IndexFieldDataCache;
|
||||
@ -529,8 +530,8 @@ public class PercolateQueryBuilder extends AbstractQueryBuilder<PercolateQueryBu
|
||||
docSearcher.setQueryCache(null);
|
||||
}
|
||||
|
||||
boolean mapUnmappedFieldsAsString = context.getIndexSettings()
|
||||
.getValue(PercolatorFieldMapper.INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING);
|
||||
PercolatorFieldMapper percolatorFieldMapper = (PercolatorFieldMapper) docMapper.mappers().getMapper(field);
|
||||
boolean mapUnmappedFieldsAsString = percolatorFieldMapper.isMapUnmappedFieldAsText();
|
||||
QueryShardContext percolateShardContext = wrap(context);
|
||||
|
||||
PercolatorFieldMapper.FieldType pft = (PercolatorFieldMapper.FieldType) fieldType;
|
||||
|
@ -41,10 +41,13 @@ import org.apache.lucene.util.BytesRef;
|
||||
import org.apache.lucene.util.BytesRefBuilder;
|
||||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.action.support.PlainActionFuture;
|
||||
import org.elasticsearch.common.Booleans;
|
||||
import org.elasticsearch.common.ParsingException;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
import org.elasticsearch.common.hash.MurmurHash3;
|
||||
import org.elasticsearch.common.io.stream.OutputStreamStreamOutput;
|
||||
import org.elasticsearch.common.logging.DeprecationLogger;
|
||||
import org.elasticsearch.common.logging.Loggers;
|
||||
import org.elasticsearch.common.settings.Setting;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
@ -52,6 +55,7 @@ import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.common.xcontent.XContentLocation;
|
||||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.common.xcontent.XContentType;
|
||||
import org.elasticsearch.index.IndexSettings;
|
||||
import org.elasticsearch.index.mapper.BinaryFieldMapper;
|
||||
import org.elasticsearch.index.mapper.FieldMapper;
|
||||
import org.elasticsearch.index.mapper.KeywordFieldMapper;
|
||||
@ -91,9 +95,13 @@ import static org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQuery
|
||||
public class PercolatorFieldMapper extends FieldMapper {
|
||||
|
||||
static final XContentType QUERY_BUILDER_CONTENT_TYPE = XContentType.SMILE;
|
||||
static final Setting<Boolean> INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING =
|
||||
Setting.boolSetting("index.percolator.map_unmapped_fields_as_string", false, Setting.Property.IndexScope);
|
||||
@Deprecated
|
||||
static final Setting<Boolean> INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING = Setting.boolSetting(
|
||||
"index.percolator.map_unmapped_fields_as_string", false, Setting.Property.IndexScope, Setting.Property.Deprecated);
|
||||
static final Setting<Boolean> INDEX_MAP_UNMAPPED_FIELDS_AS_TEXT_SETTING = Setting.boolSetting(
|
||||
"index.percolator.map_unmapped_fields_as_text", false, Setting.Property.IndexScope);
|
||||
static final String CONTENT_TYPE = "percolator";
|
||||
private static final DeprecationLogger DEPRECATION_LOGGER = new DeprecationLogger(Loggers.getLogger(PercolatorFieldMapper.class));
|
||||
private static final FieldType FIELD_TYPE = new FieldType();
|
||||
|
||||
static final byte FIELD_VALUE_SEPARATOR = 0; // nul code point
|
||||
@ -295,7 +303,7 @@ public class PercolatorFieldMapper extends FieldMapper {
|
||||
|
||||
}
|
||||
|
||||
private final boolean mapUnmappedFieldAsString;
|
||||
private final boolean mapUnmappedFieldAsText;
|
||||
private final Supplier<QueryShardContext> queryShardContext;
|
||||
private KeywordFieldMapper queryTermsField;
|
||||
private KeywordFieldMapper extractionResultField;
|
||||
@ -315,11 +323,28 @@ public class PercolatorFieldMapper extends FieldMapper {
|
||||
this.queryTermsField = queryTermsField;
|
||||
this.extractionResultField = extractionResultField;
|
||||
this.queryBuilderField = queryBuilderField;
|
||||
this.mapUnmappedFieldAsString = INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.get(indexSettings);
|
||||
this.mapUnmappedFieldAsText = getMapUnmappedFieldAsText(indexSettings);
|
||||
this.rangeFieldMapper = rangeFieldMapper;
|
||||
this.boostFields = boostFields;
|
||||
}
|
||||
|
||||
private static boolean getMapUnmappedFieldAsText(Settings indexSettings) {
|
||||
if (INDEX_MAP_UNMAPPED_FIELDS_AS_TEXT_SETTING.exists(indexSettings) &&
|
||||
INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.exists(indexSettings)) {
|
||||
throw new IllegalArgumentException("Either specify [" + INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.getKey() +
|
||||
"] or [" + INDEX_MAP_UNMAPPED_FIELDS_AS_TEXT_SETTING.getKey() + "] setting, not both");
|
||||
}
|
||||
|
||||
if (INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.exists(indexSettings)) {
|
||||
DEPRECATION_LOGGER.deprecatedAndMaybeLog(INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.getKey(),
|
||||
"The [" + INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.getKey() +
|
||||
"] setting is deprecated in favour for the [" + INDEX_MAP_UNMAPPED_FIELDS_AS_TEXT_SETTING.getKey() + "] setting");
|
||||
return INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING.get(indexSettings);
|
||||
} else {
|
||||
return INDEX_MAP_UNMAPPED_FIELDS_AS_TEXT_SETTING.get(indexSettings);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public FieldMapper updateFieldType(Map<String, MappedFieldType> fullNameToFieldType) {
|
||||
PercolatorFieldMapper updated = (PercolatorFieldMapper) super.updateFieldType(fullNameToFieldType);
|
||||
@ -364,7 +389,7 @@ public class PercolatorFieldMapper extends FieldMapper {
|
||||
|
||||
Version indexVersion = context.mapperService().getIndexSettings().getIndexVersionCreated();
|
||||
createQueryBuilderField(indexVersion, queryBuilderField, queryBuilder, context);
|
||||
Query query = toQuery(queryShardContext, mapUnmappedFieldAsString, queryBuilder);
|
||||
Query query = toQuery(queryShardContext, mapUnmappedFieldAsText, queryBuilder);
|
||||
processQuery(query, context);
|
||||
return null;
|
||||
}
|
||||
@ -487,6 +512,10 @@ public class PercolatorFieldMapper extends FieldMapper {
|
||||
}
|
||||
}
|
||||
|
||||
boolean isMapUnmappedFieldAsText() {
|
||||
return mapUnmappedFieldAsText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fails if a percolator contains an unsupported query. The following queries are not supported:
|
||||
* 1) a has_child query
|
||||
|
@ -27,6 +27,7 @@ import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.plugins.SearchPlugin;
|
||||
import org.elasticsearch.search.fetch.FetchSubPhase;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -53,7 +54,8 @@ public class PercolatorPlugin extends Plugin implements MapperPlugin, SearchPlug
|
||||
|
||||
@Override
|
||||
public List<Setting<?>> getSettings() {
|
||||
return Collections.singletonList(PercolatorFieldMapper.INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING);
|
||||
return Arrays.asList(PercolatorFieldMapper.INDEX_MAP_UNMAPPED_FIELDS_AS_TEXT_SETTING,
|
||||
PercolatorFieldMapper.INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -21,6 +21,7 @@ package org.elasticsearch.percolator;
|
||||
import org.apache.lucene.search.join.ScoreMode;
|
||||
import org.elasticsearch.action.search.SearchResponse;
|
||||
import org.elasticsearch.action.support.WriteRequest;
|
||||
import org.elasticsearch.common.settings.Setting;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
@ -46,6 +47,7 @@ import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
|
||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchHits;
|
||||
|
||||
@ -99,7 +101,7 @@ public class PercolatorQuerySearchTests extends ESSingleNodeTestCase {
|
||||
);
|
||||
client().prepareIndex("test", "employee", "q1").setSource(jsonBuilder().startObject()
|
||||
.field("query", QueryBuilders.nestedQuery("employee",
|
||||
QueryBuilders.matchQuery("employee.name", "virginia potts").operator(Operator.AND), ScoreMode.Avg)
|
||||
matchQuery("employee.name", "virginia potts").operator(Operator.AND), ScoreMode.Avg)
|
||||
).endObject())
|
||||
.get();
|
||||
client().admin().indices().prepareRefresh().get();
|
||||
@ -202,4 +204,37 @@ public class PercolatorQuerySearchTests extends ESSingleNodeTestCase {
|
||||
assertEquals("The percolator works with in-memory index and therefor shouldn't use field-data cache", 0L, fieldDataSize);
|
||||
}
|
||||
|
||||
public void testMapUnmappedFieldAsText() throws IOException {
|
||||
Settings.Builder settings = Settings.builder()
|
||||
.put("index.percolator.map_unmapped_fields_as_text", true);
|
||||
createIndex("test", settings.build(), "query", "query", "type=percolator");
|
||||
client().prepareIndex("test", "query", "1")
|
||||
.setSource(jsonBuilder().startObject().field("query", matchQuery("field1", "value")).endObject()).get();
|
||||
client().admin().indices().prepareRefresh().get();
|
||||
|
||||
SearchResponse response = client().prepareSearch("test")
|
||||
.setQuery(new PercolateQueryBuilder("query", jsonBuilder().startObject().field("field1", "value").endObject().bytes(),
|
||||
XContentType.JSON))
|
||||
.get();
|
||||
assertHitCount(response, 1);
|
||||
assertSearchHits(response, "1");
|
||||
}
|
||||
|
||||
public void testMapUnmappedFieldAsString() throws IOException {
|
||||
Settings.Builder settings = Settings.builder()
|
||||
.put("index.percolator.map_unmapped_fields_as_string", true);
|
||||
createIndex("test", settings.build(), "query", "query", "type=percolator");
|
||||
client().prepareIndex("test", "query", "1")
|
||||
.setSource(jsonBuilder().startObject().field("query", matchQuery("field1", "value")).endObject()).get();
|
||||
client().admin().indices().prepareRefresh().get();
|
||||
|
||||
SearchResponse response = client().prepareSearch("test")
|
||||
.setQuery(new PercolateQueryBuilder("query", jsonBuilder().startObject().field("field1", "value").endObject().bytes(),
|
||||
XContentType.JSON))
|
||||
.get();
|
||||
assertHitCount(response, 1);
|
||||
assertSearchHits(response, "1");
|
||||
assertSettingDeprecationsAndWarnings(new Setting[]{PercolatorFieldMapper.INDEX_MAP_UNMAPPED_FIELDS_AS_STRING_SETTING});
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user