Browse Source

Don't index object subpaths in _field_names field (#72243)

Back when we indexed every value-containing field from a document in
the _field_names field, it made sense to also index object subpaths
from that field so that we count efficiently run exists queries against
objects. However, since many fields now instead use docvalues or norms
iterators for their exists queries, and don't store their field names in
_field_names, object exists queries cannot make use of these
intermediate paths. We're still storing them, however.

This commit stops storing these intermediate paths in the _field_names
field, as they are unused and just take up extra space.
Alan Woodward 4 years ago
parent
commit
78c63ff4d1

+ 2 - 2
modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java

@@ -609,7 +609,7 @@ public class PercolatorFieldMapperTests extends ESSingleNodeTestCase {
                             .field("query_field", queryBuilder)
                         .endObject().endObject()),
                         XContentType.JSON));
-        assertThat(doc.rootDoc().getFields().size(), equalTo(12)); // also includes all other meta fields
+        assertThat(doc.rootDoc().getFields().size(), equalTo(11)); // also includes all other meta fields
         IndexableField queryBuilderField = doc.rootDoc().getField("object_field.query_field.query_builder_field");
         assertTrue(queryBuilderField.fieldType().omitNorms());
         IndexableField extractionResultField = doc.rootDoc().getField("object_field.query_field.extraction_result");
@@ -624,7 +624,7 @@ public class PercolatorFieldMapperTests extends ESSingleNodeTestCase {
                             .endArray()
                         .endObject()),
                         XContentType.JSON));
-        assertThat(doc.rootDoc().getFields().size(), equalTo(12)); // also includes all other meta fields
+        assertThat(doc.rootDoc().getFields().size(), equalTo(11)); // also includes all other meta fields
         queryBuilderAsBytes = doc.rootDoc().getField("object_field.query_field.query_builder_field").binaryValue();
         assertQueryBuilder(queryBuilderAsBytes, queryBuilder);
 

+ 1 - 3
server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java

@@ -272,9 +272,7 @@ public abstract class FieldMapper extends Mapper implements Cloneable {
         if (fieldNamesFieldMapper != null) {
             FieldNamesFieldType fieldNamesFieldType = fieldNamesFieldMapper.fieldType();
             if (fieldNamesFieldType != null && fieldNamesFieldType.isEnabled()) {
-                for (String fieldName : FieldNamesFieldMapper.extractFieldNames(fieldType().name())) {
-                    context.doc().add(new Field(FieldNamesFieldMapper.NAME, fieldName, FieldNamesFieldMapper.Defaults.FIELD_TYPE));
-                }
+                context.doc().add(new Field(FieldNamesFieldMapper.NAME, fieldType().name(), FieldNamesFieldMapper.Defaults.FIELD_TYPE));
             }
         }
     }

+ 0 - 37
server/src/main/java/org/elasticsearch/index/mapper/FieldNamesFieldMapper.java

@@ -18,7 +18,6 @@ import org.elasticsearch.common.logging.DeprecationLogger;
 import org.elasticsearch.index.query.SearchExecutionContext;
 
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -155,42 +154,6 @@ public class FieldNamesFieldMapper extends MetadataFieldMapper {
         return (FieldNamesFieldType) super.fieldType();
     }
 
-    static Iterable<String> extractFieldNames(final String fullPath) {
-        return new Iterable<String>() {
-            @Override
-            public Iterator<String> iterator() {
-                return new Iterator<>() {
-                    int endIndex = nextEndIndex(0);
-
-                    private int nextEndIndex(int index) {
-                        while (index < fullPath.length() && fullPath.charAt(index) != '.') {
-                            index += 1;
-                        }
-                        return index;
-                    }
-
-                    @Override
-                    public boolean hasNext() {
-                        return endIndex <= fullPath.length();
-                    }
-
-                    @Override
-                    public String next() {
-                        final String result = fullPath.substring(0, endIndex);
-                        endIndex = nextEndIndex(endIndex + 1);
-                        return result;
-                    }
-
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-
-                };
-            }
-        };
-    }
-
     @Override
     protected String contentType() {
         return CONTENT_TYPE;

+ 0 - 18
server/src/test/java/org/elasticsearch/index/mapper/FieldNamesFieldMapperTests.java

@@ -24,14 +24,6 @@ import java.util.TreeSet;
 
 public class FieldNamesFieldMapperTests extends MapperServiceTestCase {
 
-    private static SortedSet<String> extract(String path) {
-        SortedSet<String> set = new TreeSet<>();
-        for (String fieldName : FieldNamesFieldMapper.extractFieldNames(path)) {
-            set.add(fieldName);
-        }
-        return set;
-    }
-
     private static SortedSet<String> set(String... values) {
         return new TreeSet<>(Arrays.asList(values));
     }
@@ -41,16 +33,6 @@ public class FieldNamesFieldMapperTests extends MapperServiceTestCase {
         assertEquals(expected, set(got));
     }
 
-    public void testExtractFieldNames() {
-        assertEquals(set("abc"), extract("abc"));
-        assertEquals(set("a", "a.b"), extract("a.b"));
-        assertEquals(set("a", "a.b", "a.b.c"), extract("a.b.c"));
-        // and now corner cases
-        assertEquals(set("", ".a"), extract(".a"));
-        assertEquals(set("a", "a."), extract("a."));
-        assertEquals(set("", ".", ".."), extract(".."));
-    }
-
     public void testFieldType() throws Exception {
         DocumentMapper docMapper = createDocumentMapper(mapping(b -> {}));
         FieldNamesFieldMapper fieldNamesMapper = docMapper.metadataMapper(FieldNamesFieldMapper.class);