|
@@ -18,8 +18,10 @@
|
|
|
*/
|
|
|
package org.elasticsearch.index.mapper;
|
|
|
|
|
|
+import org.apache.lucene.analysis.core.KeywordAnalyzer;
|
|
|
+import org.apache.lucene.analysis.core.SimpleAnalyzer;
|
|
|
+import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
|
|
|
import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
|
|
-import org.apache.lucene.document.FieldType;
|
|
|
import org.apache.lucene.index.IndexOptions;
|
|
|
import org.apache.lucene.index.IndexableField;
|
|
|
import org.apache.lucene.index.Term;
|
|
@@ -37,16 +39,11 @@ import org.apache.lucene.search.similarities.BooleanSimilarity;
|
|
|
import org.apache.lucene.search.spans.FieldMaskingSpanQuery;
|
|
|
import org.apache.lucene.search.spans.SpanNearQuery;
|
|
|
import org.apache.lucene.search.spans.SpanTermQuery;
|
|
|
-import org.elasticsearch.common.Strings;
|
|
|
-import org.elasticsearch.common.bytes.BytesReference;
|
|
|
-import org.elasticsearch.common.compress.CompressedXContent;
|
|
|
import org.elasticsearch.common.lucene.search.MultiPhrasePrefixQuery;
|
|
|
-import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
-import org.elasticsearch.common.xcontent.XContentFactory;
|
|
|
-import org.elasticsearch.common.xcontent.XContentType;
|
|
|
-import org.elasticsearch.index.IndexService;
|
|
|
+import org.elasticsearch.index.IndexSettings;
|
|
|
import org.elasticsearch.index.analysis.AnalyzerScope;
|
|
|
+import org.elasticsearch.index.analysis.IndexAnalyzers;
|
|
|
import org.elasticsearch.index.analysis.NamedAnalyzer;
|
|
|
import org.elasticsearch.index.mapper.SearchAsYouTypeFieldMapper.PrefixFieldMapper;
|
|
|
import org.elasticsearch.index.mapper.SearchAsYouTypeFieldMapper.PrefixFieldType;
|
|
@@ -60,8 +57,6 @@ import org.elasticsearch.index.query.MultiMatchQueryBuilder;
|
|
|
import org.elasticsearch.index.query.QueryShardContext;
|
|
|
import org.elasticsearch.index.similarity.SimilarityProvider;
|
|
|
import org.elasticsearch.plugins.Plugin;
|
|
|
-import org.hamcrest.Matcher;
|
|
|
-import org.hamcrest.Matchers;
|
|
|
import org.junit.Before;
|
|
|
|
|
|
import java.io.IOException;
|
|
@@ -70,12 +65,12 @@ import java.util.Arrays;
|
|
|
import java.util.Collection;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
import static java.util.Arrays.asList;
|
|
|
-import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.hasProperty;
|
|
|
import static org.hamcrest.Matchers.containsInAnyOrder;
|
|
|
import static org.hamcrest.Matchers.containsString;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
@@ -83,7 +78,7 @@ import static org.hamcrest.Matchers.hasSize;
|
|
|
import static org.hamcrest.Matchers.notNullValue;
|
|
|
import static org.hamcrest.core.IsInstanceOf.instanceOf;
|
|
|
|
|
|
-public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchAsYouTypeFieldMapper.Builder> {
|
|
|
+public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase2<SearchAsYouTypeFieldMapper.Builder> {
|
|
|
|
|
|
@Before
|
|
|
public void addModifiers() {
|
|
@@ -103,8 +98,8 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected Collection<Class<? extends Plugin>> getPlugins() {
|
|
|
- return pluginList(MapperExtrasPlugin.class);
|
|
|
+ protected Collection<? extends Plugin> getPlugins() {
|
|
|
+ return List.of(new MapperExtrasPlugin());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -115,30 +110,40 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
.searchQuoteAnalyzer(new NamedAnalyzer("standard", AnalyzerScope.INDEX, new StandardAnalyzer()));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ protected IndexAnalyzers createIndexAnalyzers(IndexSettings indexSettings) {
|
|
|
+ NamedAnalyzer dflt = new NamedAnalyzer(
|
|
|
+ "default",
|
|
|
+ AnalyzerScope.INDEX,
|
|
|
+ new StandardAnalyzer(),
|
|
|
+ TextFieldMapper.Defaults.POSITION_INCREMENT_GAP
|
|
|
+ );
|
|
|
+ NamedAnalyzer standard = new NamedAnalyzer("standard", AnalyzerScope.INDEX, new StandardAnalyzer());
|
|
|
+ NamedAnalyzer keyword = new NamedAnalyzer("keyword", AnalyzerScope.INDEX, new KeywordAnalyzer());
|
|
|
+ NamedAnalyzer simple = new NamedAnalyzer("simple", AnalyzerScope.INDEX, new SimpleAnalyzer());
|
|
|
+ NamedAnalyzer whitespace = new NamedAnalyzer("whitespace", AnalyzerScope.INDEX, new WhitespaceAnalyzer());
|
|
|
+ return new IndexAnalyzers(
|
|
|
+ Map.of("default", dflt, "standard", standard, "keyword", keyword, "simple", simple, "whitespace", whitespace),
|
|
|
+ Map.of(),
|
|
|
+ Map.of()
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void minimalMapping(XContentBuilder b) throws IOException {
|
|
|
+ b.field("type", "search_as_you_type");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void metaMapping(XContentBuilder b) throws IOException {
|
|
|
+ // We serialize these fields regardless of whether or not they are changed
|
|
|
+ b.field("type", "search_as_you_type").field("max_shingle_size", 3).field("doc_values", false);
|
|
|
+ }
|
|
|
+
|
|
|
public void testIndexing() throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper mapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
- ParsedDocument doc = mapper.parse(new SourceToParse("test", "1", BytesReference
|
|
|
- .bytes(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .field("a_field", "new york city")
|
|
|
- .endObject()),
|
|
|
- XContentType.JSON));
|
|
|
-
|
|
|
- for (String field : new String[] { "a_field", "a_field._index_prefix", "a_field._2gram", "a_field._3gram"}) {
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));
|
|
|
+ ParsedDocument doc = mapper.parse(source(b -> b.field("field", "new york city")));
|
|
|
+ for (String field : new String[] { "field", "field._index_prefix", "field._2gram", "field._3gram"}) {
|
|
|
IndexableField[] fields = doc.rootDoc().getFields(field);
|
|
|
assertEquals(1, fields.length);
|
|
|
assertEquals("new york city", fields[0].stringValue());
|
|
@@ -146,340 +151,177 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
}
|
|
|
|
|
|
public void testDefaultConfiguration() throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
-
|
|
|
- final SearchAsYouTypeFieldMapper rootMapper = getRootFieldMapper(defaultMapper, "a_field");
|
|
|
+ DocumentMapper defaultMapper = createDocumentMapper(fieldMapping(this::minimalMapping));
|
|
|
+ SearchAsYouTypeFieldMapper rootMapper = getRootFieldMapper(defaultMapper, "field");
|
|
|
assertRootFieldMapper(rootMapper, 3, "default");
|
|
|
|
|
|
-
|
|
|
- final PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(defaultMapper, "a_field._index_prefix");
|
|
|
+ PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(defaultMapper, "field._index_prefix");
|
|
|
assertPrefixFieldType(prefixFieldMapper.fieldType(), 3, "default");
|
|
|
|
|
|
assertShingleFieldType(
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram").fieldType(), 2, "default", prefixFieldMapper.fieldType());
|
|
|
+ getShingleFieldMapper(defaultMapper, "field._2gram").fieldType(), 2, "default", prefixFieldMapper.fieldType());
|
|
|
assertShingleFieldType(
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram").fieldType(), 3, "default", prefixFieldMapper.fieldType());
|
|
|
+ getShingleFieldMapper(defaultMapper, "field._3gram").fieldType(), 3, "default", prefixFieldMapper.fieldType());
|
|
|
}
|
|
|
|
|
|
public void testConfiguration() throws IOException {
|
|
|
- final int maxShingleSize = 4;
|
|
|
- final String analyzerName = "simple";
|
|
|
-
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("analyzer", analyzerName)
|
|
|
- .field("max_shingle_size", maxShingleSize)
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
-
|
|
|
- final SearchAsYouTypeFieldMapper rootMapper = getRootFieldMapper(defaultMapper, "a_field");
|
|
|
+ int maxShingleSize = 4;
|
|
|
+ String analyzerName = "simple";
|
|
|
+ DocumentMapper defaultMapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "search_as_you_type").field("analyzer", analyzerName).field("max_shingle_size", maxShingleSize)
|
|
|
+ )
|
|
|
+ );
|
|
|
+
|
|
|
+ SearchAsYouTypeFieldMapper rootMapper = getRootFieldMapper(defaultMapper, "field");
|
|
|
assertRootFieldMapper(rootMapper, maxShingleSize, analyzerName);
|
|
|
|
|
|
- final PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(defaultMapper, "a_field._index_prefix");
|
|
|
+ PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(defaultMapper, "field._index_prefix");
|
|
|
assertPrefixFieldType(prefixFieldMapper.fieldType(), maxShingleSize, analyzerName);
|
|
|
|
|
|
assertShingleFieldType(
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram").fieldType(), 2, analyzerName, prefixFieldMapper.fieldType());
|
|
|
+ getShingleFieldMapper(defaultMapper, "field._2gram").fieldType(), 2, analyzerName, prefixFieldMapper.fieldType());
|
|
|
assertShingleFieldType(
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram").fieldType(), 3, analyzerName, prefixFieldMapper.fieldType());
|
|
|
+ getShingleFieldMapper(defaultMapper, "field._3gram").fieldType(), 3, analyzerName, prefixFieldMapper.fieldType());
|
|
|
assertShingleFieldType(
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._4gram").fieldType(), 4, analyzerName, prefixFieldMapper.fieldType());
|
|
|
+ getShingleFieldMapper(defaultMapper, "field._4gram").fieldType(), 4, analyzerName, prefixFieldMapper.fieldType());
|
|
|
}
|
|
|
|
|
|
public void testSimpleMerge() throws IOException {
|
|
|
- MapperService mapperService = createIndex("test").mapperService();
|
|
|
- {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("analyzer", "standard")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper mapper = mapperService.merge("_doc",
|
|
|
- new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
- }
|
|
|
-
|
|
|
- {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("analyzer", "standard")
|
|
|
- .endObject()
|
|
|
- .startObject("b_field")
|
|
|
- .field("type", "text")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper mapper = mapperService.merge("_doc",
|
|
|
- new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
- }
|
|
|
-
|
|
|
- {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("analyzer", "standard")
|
|
|
- .field("max_shingle_size", "4")
|
|
|
- .endObject()
|
|
|
- .startObject("b_field")
|
|
|
- .field("type", "text")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject());
|
|
|
- IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
|
|
|
- () -> mapperService.merge("_doc",
|
|
|
- new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE));
|
|
|
- assertThat(e.getMessage(), containsString("different [max_shingle_size]"));
|
|
|
- }
|
|
|
+ MapperService mapperService = createMapperService(
|
|
|
+ mapping(b -> b.startObject("a_field").field("type", "search_as_you_type").field("analyzer", "standard").endObject())
|
|
|
+ );
|
|
|
+ merge(mapperService, mapping(b -> {
|
|
|
+ b.startObject("a_field").field("type", "search_as_you_type").field("analyzer", "standard").endObject();
|
|
|
+ b.startObject("b_field").field("type", "text").endObject();
|
|
|
+ }));
|
|
|
+ IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> merge(mapperService, mapping(b -> {
|
|
|
+ b.startObject("a_field");
|
|
|
+ {
|
|
|
+ b.field("type", "search_as_you_type");
|
|
|
+ b.field("analyzer", "standard");
|
|
|
+ b.field("max_shingle_size", "4");
|
|
|
+ }
|
|
|
+ b.endObject();
|
|
|
+ b.startObject("b_field").field("type", "text").endObject();
|
|
|
+ })));
|
|
|
+ assertThat(e.getMessage(), containsString("different [max_shingle_size]"));
|
|
|
}
|
|
|
|
|
|
public void testMultiFields() throws IOException {
|
|
|
for (int shingleSize = 2; shingleSize < 4; shingleSize++) {
|
|
|
- final XContentBuilder mapping = XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "text")
|
|
|
- .startObject("fields")
|
|
|
- .startObject("suggest")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("max_shingle_size", shingleSize)
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject();
|
|
|
-
|
|
|
- final String index = "foo_" + shingleSize;
|
|
|
- final String path = "a_field.suggest";
|
|
|
- List<String> fields = new ArrayList<>();
|
|
|
- fields.add(path);
|
|
|
- final MapperService mapperService =
|
|
|
- createIndex(index, Settings.EMPTY, mapping).mapperService();
|
|
|
- MappedFieldType fieldType = mapperService.fieldType(path + "._index_prefix");
|
|
|
- assertThat(fieldType, instanceOf(PrefixFieldType.class));
|
|
|
- PrefixFieldType prefixFieldType = (PrefixFieldType) fieldType;
|
|
|
- assertEquals(path, prefixFieldType.parentField);
|
|
|
- for (int i = 2; i < shingleSize; i++) {
|
|
|
- String name = path + "._" + i + "gram";
|
|
|
- fields.add(name);
|
|
|
- fieldType = mapperService.fieldType(name);
|
|
|
- assertThat(fieldType, instanceOf(ShingleFieldType.class));
|
|
|
- ShingleFieldType ft = (ShingleFieldType) fieldType;
|
|
|
- assertEquals(i, ft.shingleSize);
|
|
|
- assertTrue(prefixFieldType == ft.prefixFieldType);
|
|
|
- }
|
|
|
+ assertMultiField(shingleSize);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- ParsedDocument doc = mapperService.documentMapper()
|
|
|
- .parse(new SourceToParse("test", "1",
|
|
|
- BytesReference.bytes(
|
|
|
- XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .field("a_field", "new york city")
|
|
|
- .endObject()
|
|
|
- ), XContentType.JSON)
|
|
|
- );
|
|
|
- for (String field : fields) {
|
|
|
- IndexableField[] indexFields = doc.rootDoc().getFields(field);
|
|
|
- assertEquals(1, indexFields.length);
|
|
|
- assertEquals("new york city", indexFields[0].stringValue());
|
|
|
+ private void assertMultiField(int shingleSize) throws IOException {
|
|
|
+ String path = "field.suggest";
|
|
|
+ List<String> fields = new ArrayList<>();
|
|
|
+ fields.add(path);
|
|
|
+ MapperService mapperService = createMapperService(fieldMapping(b -> {
|
|
|
+ b.field("type", "text");
|
|
|
+ b.startObject("fields");
|
|
|
+ {
|
|
|
+ b.startObject("suggest").field("type", "search_as_you_type").field("max_shingle_size", shingleSize).endObject();
|
|
|
}
|
|
|
+ b.endObject();
|
|
|
+ }));
|
|
|
+ MappedFieldType fieldType = mapperService.fieldType(path + "._index_prefix");
|
|
|
+ assertThat(fieldType, instanceOf(PrefixFieldType.class));
|
|
|
+ PrefixFieldType prefixFieldType = (PrefixFieldType) fieldType;
|
|
|
+ assertEquals(path, prefixFieldType.parentField);
|
|
|
+ for (int i = 2; i < shingleSize; i++) {
|
|
|
+ String name = path + "._" + i + "gram";
|
|
|
+ fields.add(name);
|
|
|
+ fieldType = mapperService.fieldType(name);
|
|
|
+ assertThat(fieldType, instanceOf(ShingleFieldType.class));
|
|
|
+ ShingleFieldType ft = (ShingleFieldType) fieldType;
|
|
|
+ assertEquals(i, ft.shingleSize);
|
|
|
+ assertTrue(prefixFieldType == ft.prefixFieldType);
|
|
|
+ }
|
|
|
+
|
|
|
+ ParsedDocument doc = mapperService.documentMapper().parse(source(b -> b.field("field", "new york city")));
|
|
|
+ for (String field : fields) {
|
|
|
+ IndexableField[] indexFields = doc.rootDoc().getFields(field);
|
|
|
+ assertEquals(1, indexFields.length);
|
|
|
+ assertEquals("new york city", indexFields[0].stringValue());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void testIndexOptions() throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("index_options", "offsets")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "search_as_you_type").field("index_options", "offsets"))
|
|
|
+ );
|
|
|
|
|
|
Stream.of(
|
|
|
- getRootFieldMapper(defaultMapper, "a_field"),
|
|
|
- getPrefixFieldMapper(defaultMapper, "a_field._index_prefix"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram")
|
|
|
- ).forEach(mapper -> assertThat("for " + mapper.name(),
|
|
|
- mapper.fieldType.indexOptions(), equalTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS)));
|
|
|
+ getRootFieldMapper(mapper, "field"),
|
|
|
+ getPrefixFieldMapper(mapper, "field._index_prefix"),
|
|
|
+ getShingleFieldMapper(mapper, "field._2gram"),
|
|
|
+ getShingleFieldMapper(mapper, "field._3gram")
|
|
|
+ ).forEach(m -> assertThat("for " + m.name(),
|
|
|
+ m.fieldType.indexOptions(), equalTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS)));
|
|
|
}
|
|
|
|
|
|
public void testStore() throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("store", "true")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
-
|
|
|
- assertTrue(getRootFieldMapper(defaultMapper, "a_field").fieldType.stored());
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "search_as_you_type").field("store", true)));
|
|
|
+
|
|
|
+ assertTrue(getRootFieldMapper(mapper, "field").fieldType.stored());
|
|
|
Stream.of(
|
|
|
- getPrefixFieldMapper(defaultMapper, "a_field._index_prefix"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram")
|
|
|
- ).forEach(mapper -> assertFalse("for " + mapper.name(), mapper.fieldType.stored()));
|
|
|
+ getPrefixFieldMapper(mapper, "field._index_prefix"),
|
|
|
+ getShingleFieldMapper(mapper, "field._2gram"),
|
|
|
+ getShingleFieldMapper(mapper, "field._3gram")
|
|
|
+ ).forEach(m -> assertFalse("for " + m.name(), m.fieldType.stored()));
|
|
|
}
|
|
|
|
|
|
public void testIndex() throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("index", "false")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "search_as_you_type").field("index", false)));
|
|
|
|
|
|
Stream.of(
|
|
|
- getRootFieldMapper(defaultMapper, "a_field"),
|
|
|
- getPrefixFieldMapper(defaultMapper, "a_field._index_prefix"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram")
|
|
|
- ).forEach(mapper -> assertThat("for " + mapper.name(), mapper.fieldType.indexOptions(), equalTo(IndexOptions.NONE)));
|
|
|
+ getRootFieldMapper(mapper, "field"),
|
|
|
+ getPrefixFieldMapper(mapper, "field._index_prefix"),
|
|
|
+ getShingleFieldMapper(mapper, "field._2gram"),
|
|
|
+ getShingleFieldMapper(mapper, "field._3gram")
|
|
|
+ ).forEach(m -> assertThat("for " + m.name(), m.fieldType.indexOptions(), equalTo(IndexOptions.NONE)));
|
|
|
}
|
|
|
|
|
|
public void testTermVectors() throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("term_vector", "yes")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "search_as_you_type").field("term_vector", "yes")));
|
|
|
|
|
|
Stream.of(
|
|
|
- getRootFieldMapper(defaultMapper, "a_field"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram")
|
|
|
- ).forEach(mapper -> assertTrue("for " + mapper.name(), mapper.fieldType.storeTermVectors()));
|
|
|
+ getRootFieldMapper(mapper, "field"),
|
|
|
+ getShingleFieldMapper(mapper, "field._2gram"),
|
|
|
+ getShingleFieldMapper(mapper, "field._3gram")
|
|
|
+ ).forEach(m -> assertTrue("for " + m.name(), m.fieldType.storeTermVectors()));
|
|
|
|
|
|
- final PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(defaultMapper, "a_field._index_prefix");
|
|
|
+ PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(mapper, "field._index_prefix");
|
|
|
assertFalse(prefixFieldMapper.fieldType.storeTermVectors());
|
|
|
}
|
|
|
|
|
|
public void testNorms() throws IOException {
|
|
|
// default setting
|
|
|
{
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test-1")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));
|
|
|
|
|
|
Stream.of(
|
|
|
- getRootFieldMapper(defaultMapper, "a_field"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram")
|
|
|
- ).forEach(mapper -> assertFalse("for " + mapper.name(), mapper.fieldType.omitNorms()));
|
|
|
+ getRootFieldMapper(mapper, "field"),
|
|
|
+ getShingleFieldMapper(mapper, "field._2gram"),
|
|
|
+ getShingleFieldMapper(mapper, "field._3gram")
|
|
|
+ ).forEach(m -> assertFalse("for " + m.name(), m.fieldType.omitNorms()));
|
|
|
|
|
|
- final PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(defaultMapper, "a_field._index_prefix");
|
|
|
+ PrefixFieldMapper prefixFieldMapper = getPrefixFieldMapper(mapper, "field._index_prefix");
|
|
|
assertTrue(prefixFieldMapper.fieldType.omitNorms());
|
|
|
}
|
|
|
|
|
|
- // can disable them on shingle fields
|
|
|
+ // can disable norms on search_as_you_type fields
|
|
|
{
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("norms", "false")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test-2")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "search_as_you_type").field("norms", false)));
|
|
|
|
|
|
Stream.of(
|
|
|
- getRootFieldMapper(defaultMapper, "a_field"),
|
|
|
- getPrefixFieldMapper(defaultMapper, "a_field._index_prefix"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._2gram"),
|
|
|
- getShingleFieldMapper(defaultMapper, "a_field._3gram")
|
|
|
- ).forEach(mapper -> assertTrue("for " + mapper.name(), mapper.fieldType.omitNorms()));
|
|
|
+ getRootFieldMapper(mapper, "field"),
|
|
|
+ getPrefixFieldMapper(mapper, "field._index_prefix"),
|
|
|
+ getShingleFieldMapper(mapper, "field._2gram"),
|
|
|
+ getShingleFieldMapper(mapper, "field._3gram")
|
|
|
+ ).forEach(m -> assertTrue("for " + m.name(), m.fieldType.omitNorms()));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -493,31 +335,17 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
}
|
|
|
|
|
|
public void testMatchPhrasePrefix() throws IOException {
|
|
|
- IndexService indexService = createIndex("test", Settings.EMPTY);
|
|
|
- QueryShardContext queryShardContext = indexService.newQueryShardContext(
|
|
|
- randomInt(20), null, () -> {
|
|
|
- throw new UnsupportedOperationException();
|
|
|
- }, null);
|
|
|
-
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- queryShardContext.getMapperService().merge("type", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
-
|
|
|
+ QueryShardContext queryShardContext = createQueryShardContext(createMapperService(fieldMapping(this::minimalMapping)));
|
|
|
{
|
|
|
Query q = new MatchPhrasePrefixQueryBuilder("field", "two words").toQuery(queryShardContext);
|
|
|
- Query expected = new SynonymQuery(new Term("field._index_prefix", "two words"));
|
|
|
+ Query expected = new SynonymQuery.Builder("field._index_prefix").addTerm(new Term("field._index_prefix", "two words")).build();
|
|
|
assertThat(q, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
Query q = new MatchPhrasePrefixQueryBuilder("field", "three words here").toQuery(queryShardContext);
|
|
|
- Query expected = new SynonymQuery(new Term("field._index_prefix", "three words here"));
|
|
|
+ Query expected = new SynonymQuery.Builder("field._index_prefix").addTerm(new Term("field._index_prefix", "three words here"))
|
|
|
+ .build();
|
|
|
assertThat(q, equalTo(expected));
|
|
|
}
|
|
|
|
|
@@ -572,106 +400,91 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
}
|
|
|
|
|
|
public void testMatchPhrase() throws IOException {
|
|
|
- final IndexService indexService = createIndex("test", Settings.EMPTY);
|
|
|
- final QueryShardContext queryShardContext = indexService.newQueryShardContext(randomInt(20), null,
|
|
|
- () -> { throw new UnsupportedOperationException(); }, null);
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- queryShardContext.getMapperService().merge("_doc", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
-
|
|
|
+ QueryShardContext queryShardContext = createQueryShardContext(createMapperService(fieldMapping(this::minimalMapping)));
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field", "one")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field", "one")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new TermQuery(new Term("a_field", "one"));
|
|
|
+ Query expected = new TermQuery(new Term("field", "one"));
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field", "one two")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field", "one two")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new MultiPhraseQuery.Builder()
|
|
|
- .add(new Term("a_field._2gram", "one two"))
|
|
|
+ Query expected = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("field._2gram", "one two"))
|
|
|
.build();
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field", "one two three")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field", "one two three")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new MultiPhraseQuery.Builder()
|
|
|
- .add(new Term("a_field._3gram", "one two three"))
|
|
|
+ Query expected = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("field._3gram", "one two three"))
|
|
|
.build();
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field", "one two three four")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field", "one two three four")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new MultiPhraseQuery.Builder()
|
|
|
- .add(new Term("a_field._3gram", "one two three"))
|
|
|
- .add(new Term("a_field._3gram", "two three four"))
|
|
|
+ Query expected = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("field._3gram", "one two three"))
|
|
|
+ .add(new Term("field._3gram", "two three four"))
|
|
|
.build();
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field", "one two")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field", "one two")
|
|
|
.slop(1)
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new MultiPhraseQuery.Builder()
|
|
|
- .add(new Term("a_field", "one"))
|
|
|
- .add(new Term("a_field", "two"))
|
|
|
+ Query expected = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("field", "one"))
|
|
|
+ .add(new Term("field", "two"))
|
|
|
.setSlop(1)
|
|
|
.build();
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field._2gram", "one two")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field._2gram", "one two")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new TermQuery(new Term("a_field._2gram", "one two"));
|
|
|
+ Query expected = new TermQuery(new Term("field._2gram", "one two"));
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field._2gram", "one two three")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field._2gram", "one two three")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new MultiPhraseQuery.Builder()
|
|
|
- .add(new Term("a_field._2gram", "one two"))
|
|
|
- .add(new Term("a_field._2gram", "two three"))
|
|
|
+ Query expected = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("field._2gram", "one two"))
|
|
|
+ .add(new Term("field._2gram", "two three"))
|
|
|
.build();
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field._3gram", "one two three")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field._3gram", "one two three")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new TermQuery(new Term("a_field._3gram", "one two three"));
|
|
|
+ Query expected = new TermQuery(new Term("field._3gram", "one two three"));
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- final Query actual = new MatchPhraseQueryBuilder("a_field._3gram", "one two three four")
|
|
|
+ Query actual = new MatchPhraseQueryBuilder("field._3gram", "one two three four")
|
|
|
.toQuery(queryShardContext);
|
|
|
- final Query expected = new MultiPhraseQuery.Builder()
|
|
|
- .add(new Term("a_field._3gram", "one two three"))
|
|
|
- .add(new Term("a_field._3gram", "two three four"))
|
|
|
+ Query expected = new MultiPhraseQuery.Builder()
|
|
|
+ .add(new Term("field._3gram", "one two three"))
|
|
|
+ .add(new Term("field._3gram", "two three four"))
|
|
|
.build();
|
|
|
assertThat(actual, equalTo(expected));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
expectThrows(IllegalArgumentException.class,
|
|
|
- () -> new MatchPhraseQueryBuilder("a_field._index_prefix", "one two three four").toQuery(queryShardContext));
|
|
|
+ () -> new MatchPhraseQueryBuilder("field._index_prefix", "one two three four").toQuery(queryShardContext));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -688,29 +501,16 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
}
|
|
|
|
|
|
public void testMultiMatchBoolPrefix() throws IOException {
|
|
|
- final IndexService indexService = createIndex("test", Settings.EMPTY);
|
|
|
- final QueryShardContext queryShardContext = indexService.newQueryShardContext(randomInt(20), null,
|
|
|
- () -> { throw new UnsupportedOperationException(); }, null);
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .field("max_shingle_size", 4)
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- queryShardContext.getMapperService().merge("_doc", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
-
|
|
|
- final MultiMatchQueryBuilder builder = new MultiMatchQueryBuilder(
|
|
|
+ QueryShardContext queryShardContext = createQueryShardContext(
|
|
|
+ createMapperService(fieldMapping(b -> b.field("type", "search_as_you_type").field("max_shingle_size", 4)))
|
|
|
+ );
|
|
|
+
|
|
|
+ MultiMatchQueryBuilder builder = new MultiMatchQueryBuilder(
|
|
|
"quick brown fox jump lazy dog",
|
|
|
- "a_field",
|
|
|
- "a_field._2gram",
|
|
|
- "a_field._3gram",
|
|
|
- "a_field._4gram"
|
|
|
+ "field",
|
|
|
+ "field._2gram",
|
|
|
+ "field._3gram",
|
|
|
+ "field._4gram"
|
|
|
);
|
|
|
builder.type(MultiMatchQueryBuilder.Type.BOOL_PREFIX);
|
|
|
|
|
@@ -720,60 +520,35 @@ public class SearchAsYouTypeFieldMapperTests extends FieldMapperTestCase<SearchA
|
|
|
assertThat(disMaxQuery.getDisjuncts(), hasSize(4));
|
|
|
assertThat(disMaxQuery.getDisjuncts(), containsInAnyOrder(
|
|
|
buildBoolPrefixQuery(
|
|
|
- "a_field", "a_field._index_prefix", asList("quick", "brown", "fox", "jump", "lazy", "dog")),
|
|
|
- buildBoolPrefixQuery("a_field._2gram", "a_field._index_prefix",
|
|
|
+ "field", "field._index_prefix", asList("quick", "brown", "fox", "jump", "lazy", "dog")),
|
|
|
+ buildBoolPrefixQuery("field._2gram", "field._index_prefix",
|
|
|
asList("quick brown", "brown fox", "fox jump", "jump lazy", "lazy dog")),
|
|
|
- buildBoolPrefixQuery("a_field._3gram", "a_field._index_prefix",
|
|
|
+ buildBoolPrefixQuery("field._3gram", "field._index_prefix",
|
|
|
asList("quick brown fox", "brown fox jump", "fox jump lazy", "jump lazy dog")),
|
|
|
- buildBoolPrefixQuery("a_field._4gram", "a_field._index_prefix",
|
|
|
+ buildBoolPrefixQuery("field._4gram", "field._index_prefix",
|
|
|
asList("quick brown fox jump", "brown fox jump lazy", "fox jump lazy dog"))));
|
|
|
}
|
|
|
|
|
|
private void documentParsingTestCase(Collection<String> values) throws IOException {
|
|
|
- final String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("_doc")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("a_field")
|
|
|
- .field("type", "search_as_you_type")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- final DocumentMapper defaultMapper = createIndex("test")
|
|
|
- .mapperService()
|
|
|
- .documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
-
|
|
|
- final XContentBuilder builder = XContentFactory.jsonBuilder();
|
|
|
- builder.startObject();
|
|
|
- if (values.size() > 1) {
|
|
|
- builder.array("a_field", values.toArray(new String[0]));
|
|
|
- } else {
|
|
|
- builder.field("a_field", values.iterator().next());
|
|
|
- }
|
|
|
- builder.endObject();
|
|
|
- final ParsedDocument parsedDocument = defaultMapper.parse(
|
|
|
- new SourceToParse("test", "1", BytesReference.bytes(builder), XContentType.JSON));
|
|
|
-
|
|
|
- IndexableField[] rootFields = parsedDocument.rootDoc().getFields("a_field");
|
|
|
- IndexableField[] prefixFields = parsedDocument.rootDoc().getFields("a_field._index_prefix");
|
|
|
- IndexableField[] shingle2Fields = parsedDocument.rootDoc().getFields("a_field._2gram");
|
|
|
- IndexableField[] shingle3Fields = parsedDocument.rootDoc().getFields("a_field._3gram");
|
|
|
+ DocumentMapper defaultMapper = createDocumentMapper(fieldMapping(this::minimalMapping));
|
|
|
+ final ParsedDocument parsedDocument = defaultMapper.parse(source(b -> {
|
|
|
+ if (values.size() > 1) {
|
|
|
+ b.array("field", values.toArray(new String[0]));
|
|
|
+ } else {
|
|
|
+ b.field("field", values.iterator().next());
|
|
|
+ }
|
|
|
+ }));
|
|
|
+
|
|
|
+ IndexableField[] rootFields = parsedDocument.rootDoc().getFields("field");
|
|
|
+ IndexableField[] prefixFields = parsedDocument.rootDoc().getFields("field._index_prefix");
|
|
|
+ IndexableField[] shingle2Fields = parsedDocument.rootDoc().getFields("field._2gram");
|
|
|
+ IndexableField[] shingle3Fields = parsedDocument.rootDoc().getFields("field._3gram");
|
|
|
for (IndexableField[] fields : new IndexableField[][]{ rootFields, prefixFields, shingle2Fields, shingle3Fields}) {
|
|
|
Set<String> expectedValues = Arrays.stream(fields).map(IndexableField::stringValue).collect(Collectors.toSet());
|
|
|
assertThat(values, equalTo(expectedValues));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private static Matcher<IndexableField> indexableFieldMatcher(String value, Class<? extends FieldType> fieldTypeClass) {
|
|
|
- return Matchers.allOf(
|
|
|
- hasProperty(IndexableField::stringValue, equalTo(value)),
|
|
|
- hasProperty(IndexableField::fieldType, instanceOf(fieldTypeClass))
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
private static void assertRootFieldMapper(SearchAsYouTypeFieldMapper mapper,
|
|
|
int maxShingleSize,
|
|
|
String analyzerName) {
|