From 4e30b2e84b3ea18d56e2a5328d232e190e1c71c5 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Wed, 14 Apr 2021 11:09:49 +0100 Subject: [PATCH 1/4] broekn --- .../mapper/AbstractGeometryFieldMapper.java | 63 +++++++------ .../index/mapper/GeoPointFieldMapper.java | 43 ++++++++- .../mapper/GeoPointScriptMapperTests.java | 90 +++++++++++++++++++ 3 files changed, 165 insertions(+), 31 deletions(-) create mode 100644 server/src/test/java/org/elasticsearch/index/mapper/GeoPointScriptMapperTests.java diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java index 1f2015eec88b3..ce3a7167d4d04 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java @@ -174,7 +174,9 @@ protected void parseCreateField(ParseContext context) throws IOException { @Override public void parse(ParseContext context) throws IOException { MappedFieldType mappedFieldType = fieldType(); - + if (hasScript) { + throw new IllegalArgumentException("Cannot index data directly into a field with a [script] parameter"); + } try { Processed shape = context.parseExternalValue(indexer.processedClass()); if (shape == null) { @@ -185,33 +187,8 @@ public void parse(ParseContext context) throws IOException { shape = indexer.prepareForIndexing(geometry); } - List fields = new ArrayList<>(); - if (mappedFieldType.isSearchable() || mappedFieldType.hasDocValues()) { - fields.addAll(indexer.indexShape(context, shape)); - } - - // indexed: - List indexedFields = new ArrayList<>(); - if (mappedFieldType.isSearchable()) { - indexedFields.addAll(fields); - } - // stored: - if (fieldType().isStored()) { - addStoredFields(context, shape); - } - // docValues: - if (fieldType().hasDocValues()) { - addDocValuesFields(mappedFieldType.name(), shape, fields, context); - } else if (fieldType().isStored() || fieldType().isSearchable()) { - createFieldNamesField(context); - } - - // add the indexed fields to the doc: - for (IndexableField field : indexedFields) { - context.doc().add(field); - } - - // add multifields (e.g., used for completion suggester) + indexValue(context, shape); + // Add MultiFields (eg used for completion suggester) addMultiFields(context, shape); } catch (Exception e) { if (ignoreMalformed.value() == false) { @@ -222,6 +199,36 @@ public void parse(ParseContext context) throws IOException { } } + protected void indexValue(ParseContext context, Processed shape) { + + List fields = new ArrayList<>(); + if (mappedFieldType.isSearchable() || mappedFieldType.hasDocValues()) { + fields.addAll(indexer.indexShape(context, shape)); + } + + // indexed: + List indexedFields = new ArrayList<>(); + if (mappedFieldType.isSearchable()) { + indexedFields.addAll(fields); + } + // stored: + if (fieldType().isStored()) { + addStoredFields(context, shape); + } + // docValues: + if (fieldType().hasDocValues()) { + addDocValuesFields(mappedFieldType.name(), shape, fields, context); + } else if (fieldType().isStored() || fieldType().isSearchable()) { + createFieldNamesField(context); + } + + // add the indexed fields to the doc: + for (IndexableField field : indexedFields) { + context.doc().add(field); + } + + } + public boolean ignoreMalformed() { return ignoreMalformed.value(); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java index f8c9b84c0d8a0..bef3dc423139b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java @@ -12,6 +12,7 @@ import org.apache.lucene.document.StoredField; import org.apache.lucene.geo.LatLonGeometry; import org.apache.lucene.index.IndexableField; +import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.search.IndexOrDocValuesQuery; import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; @@ -28,7 +29,11 @@ import org.elasticsearch.index.fielddata.plain.AbstractLatLonPointIndexFieldData; import org.elasticsearch.index.mapper.GeoPointFieldMapper.ParsedGeoPoint; import org.elasticsearch.index.query.SearchExecutionContext; +import org.elasticsearch.script.GeoPointFieldScript; +import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptCompiler; import org.elasticsearch.search.aggregations.support.CoreValuesSourceType; +import org.elasticsearch.search.lookup.FieldValues; import org.elasticsearch.search.lookup.SearchLookup; import java.io.IOException; @@ -37,6 +42,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Supplier; /** @@ -60,15 +66,29 @@ public static class Builder extends FieldMapper.Builder { final Parameter indexed = Parameter.indexParam(m -> builder(m).indexed.get(), true); final Parameter hasDocValues = Parameter.docValuesParam(m -> builder(m).hasDocValues.get(), true); final Parameter stored = Parameter.storeParam(m -> builder(m).stored.get(), false); + private final Parameter