From a77b38cdd1604dfa539bac36ce5a3f79f9f955a1 Mon Sep 17 00:00:00 2001 From: Masaru Hasegawa Date: Wed, 31 May 2017 18:35:01 +0900 Subject: Fix context suggester to read values from keyword type field (#24200) Closes #24129 --- .../completion/context/CategoryContextMapping.java | 9 ++++++-- .../suggest/ContextCompletionSuggestSearchIT.java | 24 +++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/CategoryContextMapping.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/CategoryContextMapping.java index 38e31ec92a..92091d8b69 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/CategoryContextMapping.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/CategoryContextMapping.java @@ -25,6 +25,7 @@ import org.elasticsearch.Version; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser.Token; +import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.ParseContext.Document; import org.elasticsearch.index.query.QueryParseContext; @@ -136,10 +137,14 @@ public class CategoryContextMapping extends ContextMapping IndexableField[] fields = document.getFields(fieldName); values = new HashSet<>(fields.length); for (IndexableField field : fields) { - values.add(field.stringValue()); + if (field.fieldType() instanceof KeywordFieldMapper.KeywordFieldType) { + values.add(field.binaryValue().utf8ToString()); + } else { + values.add(field.stringValue()); + } } } - return (values == null) ? Collections.emptySet() : values; + return (values == null) ? Collections.emptySet() : values; } @Override diff --git a/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java b/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java index a3ea5e9932..eb30c32cf6 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java @@ -19,7 +19,6 @@ package org.elasticsearch.search.suggest; import com.carrotsearch.randomizedtesting.generators.RandomStrings; - import org.apache.lucene.util.LuceneTestCase.SuppressCodecs; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexResponse; @@ -660,37 +659,42 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { .field("preserve_separators", completionMappingBuilder.preserveSeparators) .field("preserve_position_increments", completionMappingBuilder.preservePositionIncrements); + List categoryContextFields = new ArrayList<>(); if (completionMappingBuilder.contextMappings != null) { - mapping = mapping.startArray("contexts"); + mapping.startArray("contexts"); for (Map.Entry contextMapping : completionMappingBuilder.contextMappings.entrySet()) { - mapping = mapping.startObject() + mapping.startObject() .field("name", contextMapping.getValue().name()) .field("type", contextMapping.getValue().type().name()); switch (contextMapping.getValue().type()) { case CATEGORY: final String fieldName = ((CategoryContextMapping) contextMapping.getValue()).getFieldName(); if (fieldName != null) { - mapping = mapping.field("path", fieldName); + mapping.field("path", fieldName); + categoryContextFields.add(fieldName); } break; case GEO: final String name = ((GeoContextMapping) contextMapping.getValue()).getFieldName(); - mapping = mapping - .field("precision", ((GeoContextMapping) contextMapping.getValue()).getPrecision()); + mapping.field("precision", ((GeoContextMapping) contextMapping.getValue()).getPrecision()); if (name != null) { mapping.field("path", name); } break; } - mapping = mapping.endObject(); + mapping.endObject(); } - mapping = mapping.endArray(); + mapping.endArray(); } - mapping = mapping.endObject() - .endObject().endObject() + mapping.endObject(); + for (String fieldName : categoryContextFields) { + mapping.startObject(fieldName) + .field("type", randomBoolean() ? "keyword" : "text") .endObject(); + } + mapping.endObject().endObject().endObject(); assertAcked(client().admin().indices().prepareCreate(INDEX) .setSettings(Settings.builder().put(indexSettings()).put(settings)) -- cgit v1.2.3