Add test for the index_options on a keyword field. #16990
This found a bug in the validation, which was checking the wrong IndexOptions.
This commit is contained in:
parent
48cb81e30b
commit
ad7fbe7251
|
@ -85,9 +85,9 @@ public final class KeywordFieldMapper extends FieldMapper implements AllFieldMap
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Builder indexOptions(IndexOptions indexOptions) {
|
public Builder indexOptions(IndexOptions indexOptions) {
|
||||||
if (fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS) > 0) {
|
if (indexOptions.compareTo(IndexOptions.DOCS_AND_FREQS) > 0) {
|
||||||
throw new IllegalArgumentException("The [keyword] field does not support positions, got [index_options]="
|
throw new IllegalArgumentException("The [keyword] field does not support positions, got [index_options]="
|
||||||
+ indexOptionToString(fieldType.indexOptions()));
|
+ indexOptionToString(indexOptions));
|
||||||
}
|
}
|
||||||
return super.indexOptions(indexOptions);
|
return super.indexOptions(indexOptions);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.elasticsearch.test.ESSingleNodeTestCase;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
|
||||||
|
@ -200,4 +201,35 @@ public class KeywordFieldMapperTests extends ESSingleNodeTestCase {
|
||||||
assertEquals(1, fields.length);
|
assertEquals(1, fields.length);
|
||||||
assertEquals(DocValuesType.NONE, fields[0].fieldType().docValuesType());
|
assertEquals(DocValuesType.NONE, fields[0].fieldType().docValuesType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testIndexOptions() throws IOException {
|
||||||
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
||||||
|
.startObject("properties").startObject("field").field("type", "keyword")
|
||||||
|
.field("index_options", "freqs").endObject().endObject()
|
||||||
|
.endObject().endObject().string();
|
||||||
|
|
||||||
|
DocumentMapper mapper = parser.parse("type", new CompressedXContent(mapping));
|
||||||
|
|
||||||
|
assertEquals(mapping, mapper.mappingSource().toString());
|
||||||
|
|
||||||
|
ParsedDocument doc = mapper.parse("test", "type", "1", XContentFactory.jsonBuilder()
|
||||||
|
.startObject()
|
||||||
|
.field("field", "1234")
|
||||||
|
.endObject()
|
||||||
|
.bytes());
|
||||||
|
|
||||||
|
IndexableField[] fields = doc.rootDoc().getFields("field");
|
||||||
|
assertEquals(2, fields.length);
|
||||||
|
assertEquals(IndexOptions.DOCS_AND_FREQS, fields[0].fieldType().indexOptions());
|
||||||
|
|
||||||
|
for (String indexOptions : Arrays.asList("positions", "offsets")) {
|
||||||
|
final String mapping2 = XContentFactory.jsonBuilder().startObject().startObject("type")
|
||||||
|
.startObject("properties").startObject("field").field("type", "keyword")
|
||||||
|
.field("index_options", indexOptions).endObject().endObject()
|
||||||
|
.endObject().endObject().string();
|
||||||
|
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
|
||||||
|
() -> parser.parse("type", new CompressedXContent(mapping2)));
|
||||||
|
assertEquals("The [keyword] field does not support positions, got [index_options]=" + indexOptions, e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue