Returning useful exception when sorting on a completion field
Closes #3747
This commit is contained in:
parent
4aa315974b
commit
a18f47e62e
|
@ -202,4 +202,6 @@ public interface FieldMapper<T> {
|
|||
PostingsFormatProvider postingsFormatProvider();
|
||||
|
||||
boolean isNumeric();
|
||||
|
||||
boolean isSortable();
|
||||
}
|
||||
|
|
|
@ -711,4 +711,8 @@ public abstract class AbstractFieldMapper<T> implements FieldMapper<T>, Mapper {
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSortable() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -357,6 +357,10 @@ public class CompletionFieldMapper extends AbstractFieldMapper<String> {
|
|||
return CONTENT_TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSortable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FieldType defaultFieldType() {
|
||||
|
|
|
@ -31,6 +31,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData;
|
|||
import org.elasticsearch.index.fielddata.fieldcomparator.SortMode;
|
||||
import org.elasticsearch.index.mapper.FieldMapper;
|
||||
import org.elasticsearch.index.mapper.ObjectMappers;
|
||||
import org.elasticsearch.index.mapper.core.CompletionFieldMapper;
|
||||
import org.elasticsearch.index.mapper.core.NumberFieldMapper;
|
||||
import org.elasticsearch.index.mapper.object.ObjectMapper;
|
||||
import org.elasticsearch.index.query.ParsedFilter;
|
||||
|
@ -198,6 +199,10 @@ public class SortParseElement implements SearchParseElement {
|
|||
throw new SearchParseException(context, "No mapping found for [" + fieldName + "] in order to sort on");
|
||||
}
|
||||
|
||||
if (!fieldMapper.isSortable()) {
|
||||
throw new SearchParseException(context, "Sorting not supported for field[" + fieldName + "]");
|
||||
}
|
||||
|
||||
// Enable when we also know how to detect fields that do tokenize, but only emit one token
|
||||
/*if (fieldMapper instanceof StringFieldMapper) {
|
||||
StringFieldMapper stringFieldMapper = (StringFieldMapper) fieldMapper;
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.elasticsearch.action.admin.indices.segments.IndexShardSegments;
|
|||
import org.elasticsearch.action.admin.indices.segments.ShardSegments;
|
||||
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
|
||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
||||
import org.elasticsearch.action.search.SearchPhaseExecutionException;
|
||||
import org.elasticsearch.action.suggest.SuggestResponse;
|
||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
|
@ -34,6 +35,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
|
|||
import org.elasticsearch.index.mapper.MapperException;
|
||||
import org.elasticsearch.index.mapper.MapperParsingException;
|
||||
import org.elasticsearch.index.mapper.core.CompletionFieldMapper;
|
||||
import org.elasticsearch.search.sort.FieldSortBuilder;
|
||||
import org.elasticsearch.search.suggest.completion.CompletionStats;
|
||||
import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
|
||||
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
|
||||
|
@ -556,6 +558,27 @@ public class CompletionSuggestSearchTests extends AbstractIntegrationTest {
|
|||
assertThat(regexSizeInBytes, is(totalSizeInBytes));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testThatSortingOnCompletionFieldReturnsUsefulException() throws Exception {
|
||||
createIndexAndMapping();
|
||||
|
||||
client().prepareIndex(INDEX, TYPE, "1").setSource(jsonBuilder()
|
||||
.startObject().startObject(FIELD)
|
||||
.startArray("input").value("Nirvana").endArray()
|
||||
.endObject().endObject()
|
||||
).get();
|
||||
|
||||
refresh();
|
||||
try {
|
||||
client().prepareSearch(INDEX).setTypes(TYPE).addSort(new FieldSortBuilder(FIELD)).execute().actionGet();
|
||||
fail("Expected an exception due to trying to sort on completion field, but did not happen");
|
||||
} catch (SearchPhaseExecutionException e) {
|
||||
assertThat(e.status().getStatus(), is(400));
|
||||
assertThat(e.getMessage(), containsString("Sorting not supported for field[" + FIELD + "]"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void assertSuggestions(String suggestion, String... suggestions) {
|
||||
String suggestionName = RandomStrings.randomAsciiOfLength(new Random(), 10);
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
|
|
Loading…
Reference in New Issue