Browse Source

Issue #2121 Added limit parameter for string type.

Martijn van Groningen 13 years ago
parent
commit
41b3a454cf

+ 24 - 3
src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java

@@ -49,6 +49,7 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
         // NOTE, when adding defaults here, make sure you add them in the builder
         // NOTE, when adding defaults here, make sure you add them in the builder
         public static final String NULL_VALUE = null;
         public static final String NULL_VALUE = null;
         public static final int POSITION_OFFSET_GAP = 0;
         public static final int POSITION_OFFSET_GAP = 0;
+        public static final int DEFAULT_LIMIT = -1;
     }
     }
 
 
     public static class Builder extends AbstractFieldMapper.OpenBuilder<Builder, StringFieldMapper> {
     public static class Builder extends AbstractFieldMapper.OpenBuilder<Builder, StringFieldMapper> {
@@ -59,6 +60,8 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
 
 
         protected NamedAnalyzer searchQuotedAnalyzer;
         protected NamedAnalyzer searchQuotedAnalyzer;
 
 
+        protected int limit = Defaults.DEFAULT_LIMIT;
+
         public Builder(String name) {
         public Builder(String name) {
             super(name);
             super(name);
             builder = this;
             builder = this;
@@ -94,6 +97,11 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
             return builder;
             return builder;
         }
         }
 
 
+        public Builder limit(int limit) {
+            this.limit = limit;
+            return this;
+        }
+
         @Override
         @Override
         public StringFieldMapper build(BuilderContext context) {
         public StringFieldMapper build(BuilderContext context) {
             if (positionOffsetGap > 0) {
             if (positionOffsetGap > 0) {
@@ -103,7 +111,7 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
             }
             }
             StringFieldMapper fieldMapper = new StringFieldMapper(buildNames(context),
             StringFieldMapper fieldMapper = new StringFieldMapper(buildNames(context),
                     index, store, termVector, boost, omitNorms, omitTermFreqAndPositions, nullValue,
                     index, store, termVector, boost, omitNorms, omitTermFreqAndPositions, nullValue,
-                    indexAnalyzer, searchAnalyzer, searchQuotedAnalyzer, positionOffsetGap);
+                    indexAnalyzer, searchAnalyzer, searchQuotedAnalyzer, positionOffsetGap, limit);
             fieldMapper.includeInAll(includeInAll);
             fieldMapper.includeInAll(includeInAll);
             return fieldMapper;
             return fieldMapper;
         }
         }
@@ -138,6 +146,8 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
                     if (builder.searchQuotedAnalyzer == null) {
                     if (builder.searchQuotedAnalyzer == null) {
                         builder.searchQuotedAnalyzer = parserContext.analysisService().defaultSearchQuoteAnalyzer();
                         builder.searchQuotedAnalyzer = parserContext.analysisService().defaultSearchQuoteAnalyzer();
                     }
                     }
+                } else if (propName.equals("limit")) {
+                    builder.limit(XContentMapValues.nodeIntegerValue(propNode, -1));
                 }
                 }
             }
             }
             return builder;
             return builder;
@@ -152,19 +162,24 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
 
 
     private NamedAnalyzer searchQuotedAnalyzer;
     private NamedAnalyzer searchQuotedAnalyzer;
 
 
+    private int limit;
+
     protected StringFieldMapper(Names names, Field.Index index, Field.Store store, Field.TermVector termVector,
     protected StringFieldMapper(Names names, Field.Index index, Field.Store store, Field.TermVector termVector,
                                 float boost, boolean omitNorms, boolean omitTermFreqAndPositions,
                                 float boost, boolean omitNorms, boolean omitTermFreqAndPositions,
                                 String nullValue, NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer) {
                                 String nullValue, NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer) {
-        this(names, index, store, termVector, boost, omitNorms, omitTermFreqAndPositions, nullValue, indexAnalyzer, searchAnalyzer, searchAnalyzer, Defaults.POSITION_OFFSET_GAP);
+        this(names, index, store, termVector, boost, omitNorms, omitTermFreqAndPositions, nullValue, indexAnalyzer,
+                searchAnalyzer, searchAnalyzer, Defaults.POSITION_OFFSET_GAP, Defaults.DEFAULT_LIMIT);
     }
     }
 
 
     protected StringFieldMapper(Names names, Field.Index index, Field.Store store, Field.TermVector termVector,
     protected StringFieldMapper(Names names, Field.Index index, Field.Store store, Field.TermVector termVector,
                                 float boost, boolean omitNorms, boolean omitTermFreqAndPositions,
                                 float boost, boolean omitNorms, boolean omitTermFreqAndPositions,
-                                String nullValue, NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer, NamedAnalyzer searchQuotedAnalyzer, int positionOffsetGap) {
+                                String nullValue, NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer,
+                                NamedAnalyzer searchQuotedAnalyzer, int positionOffsetGap, int limit) {
         super(names, index, store, termVector, boost, omitNorms, omitTermFreqAndPositions, indexAnalyzer, searchAnalyzer);
         super(names, index, store, termVector, boost, omitNorms, omitTermFreqAndPositions, indexAnalyzer, searchAnalyzer);
         this.nullValue = nullValue;
         this.nullValue = nullValue;
         this.positionOffsetGap = positionOffsetGap;
         this.positionOffsetGap = positionOffsetGap;
         this.searchQuotedAnalyzer = searchQuotedAnalyzer != null ? searchQuotedAnalyzer : this.searchAnalyzer;
         this.searchQuotedAnalyzer = searchQuotedAnalyzer != null ? searchQuotedAnalyzer : this.searchAnalyzer;
+        this.limit = limit;
     }
     }
 
 
     @Override
     @Override
@@ -254,6 +269,9 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
         if (value == null) {
         if (value == null) {
             return null;
             return null;
         }
         }
+        if (limit > 0 && value.length() > limit) {
+            return null;
+        }
         if (context.includeInAll(includeInAll, this)) {
         if (context.includeInAll(includeInAll, this)) {
             context.allEntries().addText(names.fullName(), value, boost);
             context.allEntries().addText(names.fullName(), value, boost);
         }
         }
@@ -313,5 +331,8 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
         if (searchQuotedAnalyzer != null && searchAnalyzer != searchQuotedAnalyzer) {
         if (searchQuotedAnalyzer != null && searchAnalyzer != searchQuotedAnalyzer) {
             builder.field("search_quote_analyzer", searchQuotedAnalyzer.name());
             builder.field("search_quote_analyzer", searchQuotedAnalyzer.name());
         }
         }
+        if (limit != Defaults.DEFAULT_LIMIT) {
+            builder.field("limit", limit);
+        }
     }
     }
 }
 }

+ 15 - 0
src/test/java/org/elasticsearch/test/unit/index/mapper/simple/SimpleMapperTests.java

@@ -120,4 +120,19 @@ public class SimpleMapperTests {
         DocumentMapper builtDocMapper = MapperTests.newParser().parse(builtMapping);
         DocumentMapper builtDocMapper = MapperTests.newParser().parse(builtMapping);
         assertThat((String) builtDocMapper.meta().get("param1"), equalTo("value1"));
         assertThat((String) builtDocMapper.meta().get("param1"), equalTo("value1"));
     }
     }
+
+    @Test
+    public void testLimit() throws Exception {
+        String mapping = copyToStringFromClasspath("/org/elasticsearch/test/unit/index/mapper/simple/test-mapping.json");
+        DocumentMapper docMapper = MapperTests.newParser().parse(mapping);
+        String builtMapping = docMapper.mappingSource().string();
+
+        // reparse it
+        DocumentMapper builtDocMapper = MapperTests.newParser().parse(builtMapping);
+        BytesReference json = new BytesArray(copyToBytesFromClasspath("/org/elasticsearch/test/unit/index/mapper/simple/test1.json"));
+        Document doc = builtDocMapper.parse(json).rootDoc();
+        assertThat(doc.get(docMapper.uidMapper().names().indexName()), equalTo(Uid.createUid("person", "1")));
+        assertThat(doc.getValues("cats").length, equalTo(1));
+        assertThat(doc.getValues("cats")[0], equalTo("felix"));
+    }
 }
 }

+ 5 - 0
src/test/java/org/elasticsearch/test/unit/index/mapper/simple/test-mapping.json

@@ -71,6 +71,11 @@
                 type:"string",
                 type:"string",
                 index_name:"dog"
                 index_name:"dog"
             },
             },
+            cats:{
+                type:"string",
+                index_name:"cats",
+                limit:10
+            },
             complex:{
             complex:{
                 type:"object",
                 type:"object",
                 properties:{
                 properties:{

+ 1 - 0
src/test/java/org/elasticsearch/test/unit/index/mapper/simple/test1.json

@@ -18,6 +18,7 @@
         birthDate:"1977-11-15",
         birthDate:"1977-11-15",
         nerd:true,
         nerd:true,
         dogs:["buck", "mia"],
         dogs:["buck", "mia"],
+        cats:["name to long for a cat", "felix"],
         complex:[
         complex:[
             {
             {
                 value1:"value1"
                 value1:"value1"