You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by eh...@apache.org on 2007/09/27 18:43:46 UTC

svn commit: r580089 - in /lucene/solr/trunk: ./ client/java/solrj/src/org/apache/solr/client/solrj/response/ src/java/org/apache/solr/common/luke/ src/java/org/apache/solr/handler/admin/

Author: ehatcher
Date: Thu Sep 27 09:43:42 2007
New Revision: 580089

URL: http://svn.apache.org/viewvc?rev=580089&view=rev
Log:
SOLR-359: LukeResponse.FieldInfo should expose the selected flags info and the indexInfo

Added:
    lucene/solr/trunk/src/java/org/apache/solr/common/luke/
    lucene/solr/trunk/src/java/org/apache/solr/common/luke/FieldFlag.java
Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/response/LukeResponse.java
    lucene/solr/trunk/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=580089&r1=580088&r2=580089&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Thu Sep 27 09:43:42 2007
@@ -131,6 +131,11 @@
     sqrt, abs, scale, map.  Constants may now be used as a value source.
     (yonik)
 
+25. SOLR-359: Add field type className to Luke response, and enabled access
+    to the detailed field information from the solrj client API.
+    (Grant Ingersoll via ehatcher)
+    
+
 Changes in runtime behavior
 
 Optimizations

Modified: lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/response/LukeResponse.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/response/LukeResponse.java?rev=580089&r1=580088&r2=580089&view=diff
==============================================================================
--- lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/response/LukeResponse.java (original)
+++ lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/response/LukeResponse.java Thu Sep 27 09:43:42 2007
@@ -17,147 +17,233 @@
 
 package org.apache.solr.client.solrj.response;
 
-import java.util.HashMap;
-import java.util.Map;
-
+import org.apache.solr.common.luke.FieldFlag;
 import org.apache.solr.common.util.NamedList;
 
+import java.util.*;
+
 
 /**
  * This is an incomplete representation of the data returned from Luke
- * 
+ * + *
+ *
  * @version $Id$
  * @since solr 1.3
  */
-public class LukeResponse extends SolrResponseBase
-{
+public class LukeResponse extends SolrResponseBase {
+
+  public static class FieldTypeInfo {
+    String name;
+    String className;
+    boolean tokenized;
+    String analyzer;
+    List<String> fields;
+
+
+    public FieldTypeInfo(String name) {
+      this.name = name;
+      fields = Collections.emptyList();
+    }
+
+
+    public String getAnalyzer() {
+      return analyzer;
+    }
+
+    public String getClassName() {
+      return className;
+    }
+
+    public List<String> getFields() {
+      return fields;
+    }
+
+    public String getName() {
+      return name;
+    }
+
+    public boolean isTokenized() {
+      return tokenized;
+    }/*
+     Sample:
+     types={ignored={fields=null,tokenized=false,analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@f94934},
+     integer={fields=null,tokenized=false,analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@3525a2},
+     sfloat={fields=[price, weight],tokenized=false,analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@39cf9c},
+     text_ws={fields=[cat],tokenized=true,analyzer=TokenizerChain(org.apache.solr.analysis.WhitespaceTokenizerFactory@6d3ca2)},
+     alphaOnlySort={fields=[alphaNameSort],tokenized=true,analyzer=TokenizerChain(org.apache.solr.analysis.KeywordTokenizerFactory@a7bd3b,
+      org.apache.solr.analysis.LowerCaseFilterFactory@78aae2, org.apache.solr.analysis.TrimFilterFactory@1b16a7,
+      org.apache.solr.analysis.PatternReplaceFilterFactory@6c6b08)},date={fields=[timestamp],tokenized=false,
+      analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@e6e42e},sint={fields=[popularity],
+      tokenized=false,analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@8ea21d},
+      boolean={fields=[inStock],tokenized=false,analyzer=org.apache.solr.schema.BoolField$1@354949},
+      textTight={fields=[sku],tokenized=true,analyzer=TokenizerChain(org.apache.solr.analysis.WhitespaceTokenizerFactory@5e88f7,
+       org.apache.solr.analysis.SynonymFilterFactory@723646, org.apache.solr.analysis.StopFilterFactory@492ff1,
+       org.apache.solr.analysis.WordDelimiterFilterFactory@eaabad, org.apache.solr.analysis.LowerCaseFilterFactory@ad1355,
+        org.apache.solr.analysis.EnglishPorterFilterFactory@d03a00, org.apache.solr.analysis.RemoveDuplicatesTokenFilterFactory@900079)},
+        long={fields=null,tokenized=false,analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@f3b83},
+        double={fields=null,tokenized=false,analyzer=org.apache.solr.schema.FieldType$DefaultAnalyzer@c2b07},
+
+      */
+
+    @SuppressWarnings("unchecked")
+    public void read(NamedList<Object> nl) {
+      for (Map.Entry<String, Object> entry : nl) {
+        String key = entry.getKey();
+        if ("fields".equals(key) && entry.getValue() != null) {
+          List<String> theFields = (List<String>) entry.getValue();
+          fields = new ArrayList<String>(theFields);
+        } else if ("tokenized".equals(key) == true) {
+          tokenized = Boolean.parseBoolean(entry.getValue().toString());
+        } else if ("analyzer".equals(key) == true) {
+          analyzer = entry.getValue().toString();
+        } else if ("className".equals(key) == true) {
+          className = entry.getValue().toString();
+        }
+      }
+    }
+  }
+
   public static class FieldInfo {
     String name;
     String type;
     String schema;
     int docs;
     int distinct;
+    EnumSet<FieldFlag> flags;
     boolean cacheableFaceting;
     NamedList<Integer> topTerms;
-    
-    public FieldInfo( String n )
-    {
+
+    public FieldInfo(String n) {
       name = n;
     }
-    
+
+
     @SuppressWarnings("unchecked")
-    public void read( NamedList<Object> nl )
-    {
-      for( Map.Entry<String, Object> entry : nl ) {
-        if( "type".equals( entry.getKey() ) ) {
-          type = (String)entry.getValue();
-        }
-        else if( "schema".equals( entry.getKey() ) ) {
-          schema = (String)entry.getValue();
-        }
-        else if( "docs".equals( entry.getKey() ) ) {
-          docs = (Integer)entry.getValue();
-        }
-        else if( "distinct".equals( entry.getKey() ) ) {
-          distinct = (Integer)entry.getValue();
-        }
-        else if( "cacheableFaceting".equals( entry.getKey() ) ) {
-          cacheableFaceting = (Boolean)entry.getValue();
-        }
-        else if( "topTerms".equals( entry.getKey() ) ) {
-          topTerms = (NamedList<Integer>)entry.getValue();
+    public void read(NamedList<Object> nl) {
+      for (Map.Entry<String, Object> entry : nl) {
+        if ("type".equals(entry.getKey())) {
+          type = (String) entry.getValue();
+        }
+        if ("flags".equals(entry.getKey())) {
+          flags = parseFlags((String) entry.getValue());
+        } else if ("schema".equals(entry.getKey())) {
+          schema = (String) entry.getValue();
+        } else if ("docs".equals(entry.getKey())) {
+          docs = (Integer) entry.getValue();
+        } else if ("distinct".equals(entry.getKey())) {
+          distinct = (Integer) entry.getValue();
+        } else if ("cacheableFaceting".equals(entry.getKey())) {
+          cacheableFaceting = (Boolean) entry.getValue();
+        } else if ("topTerms".equals(entry.getKey())) {
+          topTerms = (NamedList<Integer>) entry.getValue();
         }
       }
     }
 
-    public boolean isCacheableFaceting() {
-      return cacheableFaceting;
-    }
-
-    public int getDistinct() {
-      return distinct;
-    }
-
-    public int getDocs() {
-      return docs;
+    public static EnumSet<FieldFlag> parseFlags(String flagStr) {
+      EnumSet<FieldFlag> result = EnumSet.noneOf(FieldFlag.class);
+      char[] chars = flagStr.toCharArray();
+      for (int i = 0; i < chars.length; i++) {
+        if (chars[i] != '-') {
+          FieldFlag flag = FieldFlag.getFlag(chars[i]);
+          result.add(flag);
+        }
+      }
+      return result;
     }
 
-    public String getName() {
-      return name;
-    }
 
-    public String getSchema() {
-      return schema;
+    public EnumSet<FieldFlag> getFlags() {
+      return flags;
     }
 
-    public NamedList<Integer> getTopTerms() {
-      return topTerms;
+    public boolean isCacheableFaceting() {
+      return cacheableFaceting;
     }
 
     public String getType() {
       return type;
     }
-  };
+  }
 
   private NamedList<Object> indexInfo;
-  private Map<String,FieldInfo> fieldInfo;
-  
+  private Map<String, FieldInfo> fieldInfo;
+  private Map<String, FieldTypeInfo> fieldTypeInfo;
+
   @SuppressWarnings("unchecked")
   public LukeResponse(NamedList<Object> res) {
     super(res);
-    
+
     // Parse indexinfo
-    indexInfo = (NamedList<Object>)res.get( "index" );
-    
-    NamedList<Object> flds = (NamedList<Object>)res.get( "fields" );
-    if (flds==null) {
-    	flds = (NamedList<Object>) ((NamedList<Object>)res.get( "schema" )).get("fields");
-    }
-    if( flds != null ) {
-      fieldInfo = new HashMap<String,FieldInfo>( );
-      for( Map.Entry<String, Object> field : flds ) {
-        FieldInfo f = new FieldInfo( field.getKey() );
-        f.read( (NamedList<Object>)field.getValue() );
-        fieldInfo.put( field.getKey(), f );
+    indexInfo = (NamedList<Object>) res.get("index");
+
+    NamedList<Object> flds = (NamedList<Object>) res.get("fields");
+    if (flds == null) {
+      flds = (NamedList<Object>) ((NamedList<Object>) res.get("schema")).get("fields");
+    }
+    if (flds != null) {
+      fieldInfo = new HashMap<String, FieldInfo>();
+      for (Map.Entry<String, Object> field : flds) {
+        FieldInfo f = new FieldInfo(field.getKey());
+        f.read((NamedList<Object>) field.getValue());
+        fieldInfo.put(field.getKey(), f);
       }
     }
+
+    NamedList<Object> fldTypes = (NamedList<Object>) ((NamedList<Object>) res.get("schema")).get("types");
+    if (fldTypes != null) {
+      fieldTypeInfo = new HashMap<String, FieldTypeInfo>();
+      for (Map.Entry<String, Object> fieldType : fldTypes) {
+        FieldTypeInfo ft = new FieldTypeInfo(fieldType.getKey());
+        ft.read((NamedList<Object>) fieldType.getValue());
+        fieldTypeInfo.put(fieldType.getKey(), ft);
+      }
+    }
+
   }
 
   //----------------------------------------------------------------
   //----------------------------------------------------------------
-  
-  public String getIndexDirectory()
-  {
-    if( indexInfo == null ) return null;
-    return (String)indexInfo.get( "directory" );
+
+  public String getIndexDirectory() {
+    if (indexInfo == null) return null;
+    return (String) indexInfo.get("directory");
+  }
+
+  public Integer getNumDocs() {
+    if (indexInfo == null) return null;
+    return (Integer) indexInfo.get("numDocs");
+  }
+
+  public Integer getMaxDoc() {
+    if (indexInfo == null) return null;
+    return (Integer) indexInfo.get("maxDoc");
+  }
+
+  public Integer getNumTerms() {
+    if (indexInfo == null) return null;
+    return (Integer) indexInfo.get("numTerms");
   }
 
-  public Integer getNumDocs()
-  {
-    if( indexInfo == null ) return null;
-    return (Integer)indexInfo.get( "numDocs" );
+  public Map<String, FieldTypeInfo> getFieldTypeInfo() {
+    return fieldTypeInfo;
   }
 
-  public Integer getMaxDoc()
-  {
-    if( indexInfo == null ) return null;
-    return (Integer)indexInfo.get( "maxDoc" );
+  public FieldTypeInfo getFieldTypeInfo(String name) {
+    return fieldTypeInfo.get(name);
   }
 
-  public Integer getNumTerms()
-  {
-    if( indexInfo == null ) return null;
-    return (Integer)indexInfo.get( "numTerms" );
+  public NamedList<Object> getIndexInfo() {
+    return indexInfo;
   }
 
-  public Map<String,FieldInfo> getFieldInfo() {
+  public Map<String, FieldInfo> getFieldInfo() {
     return fieldInfo;
   }
 
-  public FieldInfo getFieldInfo( String f ) {
-    return fieldInfo.get( f );
+  public FieldInfo getFieldInfo(String f) {
+    return fieldInfo.get(f);
   }
 
-  //----------------------------------------------------------------
   //----------------------------------------------------------------
 }

Added: lucene/solr/trunk/src/java/org/apache/solr/common/luke/FieldFlag.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/common/luke/FieldFlag.java?rev=580089&view=auto
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/common/luke/FieldFlag.java (added)
+++ lucene/solr/trunk/src/java/org/apache/solr/common/luke/FieldFlag.java Thu Sep 27 09:43:42 2007
@@ -0,0 +1,43 @@
+package org.apache.solr.common.luke;
+
+/**
+ *  The FieldFlag class is used to store 
+ *
+ **/
+public enum FieldFlag {
+    INDEXED('I', "Indexed"), TOKENIZED('T', "Tokenized"), STORED('S', "Stored"), MULTI_VALUED('M', "Multivalued"),
+    TERM_VECTOR_STORED('V', "TermVector Stored"), TERM_VECTOR_OFFSET('o', "Store Offset With TermVector"),
+    TERM_VECTOR_POSITION('p', "Store Position With TermVector"),
+    OMIT_NORMS('O', "Omit Norms"), LAZY('L', "Lazy"), BINARY('B', "Binary"), COMPRESSED('C', "Compressed"),
+    SORT_MISSING_FIRST('f', "Sort Missing First"), SORT_MISSING_LAST('l', "Sort Missing Last");
+
+    private char abbreviation;
+    private String display;
+
+
+    FieldFlag(char abbreviation, String display) {
+      this.abbreviation = abbreviation;
+      this.display = display;
+      this.display.intern();//QUESTION:  Need we bother here?
+    }
+
+    public static FieldFlag getFlag(char abbrev){
+      FieldFlag result = null;
+      FieldFlag [] vals = FieldFlag.values();
+      for (int i = 0; i < vals.length; i++) {
+         if (vals[i].getAbbreviation() == abbrev){
+           result = vals[i];
+           break;
+         }
+      }
+      return result;
+    }
+
+    public char getAbbreviation() {
+      return abbreviation;
+    }
+
+    public String getDisplay() {
+      return display;
+    }
+  }

Modified: lucene/solr/trunk/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java?rev=580089&r1=580088&r2=580089&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java Thu Sep 27 09:43:42 2007
@@ -17,21 +17,6 @@
 
 package org.apache.solr.handler.admin;
 
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.index.IndexReader;
@@ -44,6 +29,7 @@
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.PriorityQueue;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.luke.FieldFlag;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
@@ -59,6 +45,13 @@
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.search.SolrQueryParser;
 
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 /**
  * This handler exposes the internal lucene index.  It is inspired by and 
  * modeled on Luke, the Lucene Index Browser by Andrzej Bialecki.
@@ -150,26 +143,28 @@
     info.add( "NOTE", "Document Frequency (df) is not updated when a document is marked for deletion.  df values include deleted documents." ); 
     rsp.add( "info", info );
   }
+
   
+
   /**
    * @return a string representing a Fieldable's flags.  
    */
   private static String getFieldFlags( Fieldable f )
   {
     StringBuilder flags = new StringBuilder();
-    flags.append( (f != null && f.isIndexed())                     ? 'I' : '-' );
-    flags.append( (f != null && f.isTokenized())                   ? 'T' : '-' );
-    flags.append( (f != null && f.isStored())                      ? 'S' : '-' );
-    flags.append( (false)                                          ? 'M' : '-' ); // SchemaField Specific
-    flags.append( (f != null && f.isTermVectorStored())            ? 'V' : '-' );
-    flags.append( (f != null && f.isStoreOffsetWithTermVector())   ? 'o' : '-' );
-    flags.append( (f != null && f.isStorePositionWithTermVector()) ? 'p' : '-' );
-    flags.append( (f != null && f.getOmitNorms())                  ? 'O' : '-' );
-    flags.append( (f != null && f.isLazy())                        ? 'L' : '-' );
-    flags.append( (f != null && f.isBinary())                      ? 'B' : '-' );
-    flags.append( (f != null && f.isCompressed())                  ? 'C' : '-' );
-    flags.append( (false)                                          ? 'f' : '-' ); // SchemaField Specific
-    flags.append( (false)                                          ? 'l' : '-' ); // SchemaField Specific
+    flags.append( (f != null && f.isIndexed())                     ? FieldFlag.INDEXED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isTokenized())                   ? FieldFlag.TOKENIZED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isStored())                      ? FieldFlag.STORED.getAbbreviation() : '-' );
+    flags.append( (false)                                          ? FieldFlag.MULTI_VALUED.getAbbreviation() : '-' ); // SchemaField Specific
+    flags.append( (f != null && f.isTermVectorStored())            ? FieldFlag.TERM_VECTOR_STORED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isStoreOffsetWithTermVector())   ? FieldFlag.TERM_VECTOR_OFFSET.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isStorePositionWithTermVector()) ? FieldFlag.TERM_VECTOR_POSITION.getAbbreviation() : '-' );
+    flags.append( (f != null && f.getOmitNorms())                  ? FieldFlag.OMIT_NORMS.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isLazy())                        ? FieldFlag.LAZY.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isBinary())                      ? FieldFlag.BINARY.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isCompressed())                  ? FieldFlag.COMPRESSED.getAbbreviation() : '-' );
+    flags.append( (false)                                          ? FieldFlag.SORT_MISSING_FIRST.getAbbreviation() : '-' ); // SchemaField Specific
+    flags.append( (false)                                          ? FieldFlag.SORT_MISSING_LAST.getAbbreviation() : '-' ); // SchemaField Specific
     return flags.toString();
   }
   
@@ -185,41 +180,41 @@
     boolean binary = false; // Currently not possible
     
     StringBuilder flags = new StringBuilder();
-    flags.append( (f != null && f.indexed())             ? 'I' : '-' );
-    flags.append( (t != null && t.isTokenized())         ? 'T' : '-' );
-    flags.append( (f != null && f.stored())              ? 'S' : '-' );
-    flags.append( (f != null && f.multiValued())         ? 'M' : '-' );
-    flags.append( (f != null && f.storeTermVector() )    ? 'V' : '-' );
-    flags.append( (f != null && f.storeTermOffsets() )   ? 'o' : '-' );
-    flags.append( (f != null && f.storeTermPositions() ) ? 'p' : '-' );
-    flags.append( (f != null && f.omitNorms())           ? 'O' : '-' );
-    flags.append( (lazy)                                 ? 'L' : '-' );
-    flags.append( (binary)                               ? 'B' : '-' );
-    flags.append( (f != null && f.isCompressed())        ? 'C' : '-' );
-    flags.append( (f != null && f.sortMissingFirst() )   ? 'f' : '-' );
-    flags.append( (f != null && f.sortMissingLast() )    ? 'l' : '-' );
+    flags.append( (f != null && f.indexed())             ? FieldFlag.INDEXED.getAbbreviation() : '-' );
+    flags.append( (t != null && t.isTokenized())         ? FieldFlag.TOKENIZED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.stored())              ? FieldFlag.STORED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.multiValued())         ? FieldFlag.MULTI_VALUED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.storeTermVector() )    ? FieldFlag.TERM_VECTOR_STORED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.storeTermOffsets() )   ? FieldFlag.TERM_VECTOR_OFFSET.getAbbreviation() : '-' );
+    flags.append( (f != null && f.storeTermPositions() ) ? FieldFlag.TERM_VECTOR_POSITION.getAbbreviation() : '-' );
+    flags.append( (f != null && f.omitNorms())           ? FieldFlag.OMIT_NORMS.getAbbreviation() : '-' );
+    flags.append( (lazy)                                 ? FieldFlag.LAZY.getAbbreviation() : '-' );
+    flags.append( (binary)                               ? FieldFlag.BINARY.getAbbreviation() : '-' );
+    flags.append( (f != null && f.isCompressed())        ? FieldFlag.COMPRESSED.getAbbreviation() : '-' );
+    flags.append( (f != null && f.sortMissingFirst() )   ? FieldFlag.SORT_MISSING_FIRST.getAbbreviation() : '-' );
+    flags.append( (f != null && f.sortMissingLast() )    ? FieldFlag.SORT_MISSING_LAST.getAbbreviation() : '-' );
     return flags.toString();
   }
   
   /**
    * @return a key to what each character means
    */
-  private static SimpleOrderedMap<String> getFieldFlagsKey()
+  public static SimpleOrderedMap<String> getFieldFlagsKey()
   {
     SimpleOrderedMap<String> key = new SimpleOrderedMap<String>();
-    key.add( "I", "Indexed" );                     
-    key.add( "T", "Tokenized" );                   
-    key.add( "S", "Stored" );                   
-    key.add( "M", "Multivalued" );                     
-    key.add( "V", "TermVector Stored" );            
-    key.add( "o", "Store Offset With TermVector" );   
-    key.add( "p", "Store Position With TermVector" ); 
-    key.add( "O", "Omit Norms" );                  
-    key.add( "L", "Lazy" );                        
-    key.add( "B", "Binary" );                      
-    key.add( "C", "Compressed" );                  
-    key.add( "f", "Sort Missing First" );                  
-    key.add( "l", "Sort Missing Last" );                  
+    key.add(String.valueOf(FieldFlag.INDEXED.getAbbreviation()), FieldFlag.INDEXED.getDisplay() );
+    key.add(String.valueOf(FieldFlag.TOKENIZED.getAbbreviation()), FieldFlag.TOKENIZED.getDisplay() );
+    key.add( String.valueOf(FieldFlag.STORED.getAbbreviation()), FieldFlag.STORED.getDisplay() );
+    key.add( String.valueOf(FieldFlag.MULTI_VALUED.getAbbreviation()), FieldFlag.MULTI_VALUED.getDisplay() );
+    key.add( String.valueOf(FieldFlag.TERM_VECTOR_STORED.getAbbreviation()), FieldFlag.TERM_VECTOR_STORED.getDisplay() );
+    key.add( String.valueOf(FieldFlag.TERM_VECTOR_OFFSET.getAbbreviation()), FieldFlag.TERM_VECTOR_OFFSET.getDisplay() );
+    key.add( String.valueOf(FieldFlag.TERM_VECTOR_POSITION.getAbbreviation()), FieldFlag.TERM_VECTOR_POSITION.getDisplay() );
+    key.add( String.valueOf(FieldFlag.OMIT_NORMS.getAbbreviation()), FieldFlag.OMIT_NORMS.getDisplay() );
+    key.add( String.valueOf(FieldFlag.LAZY.getAbbreviation()), FieldFlag.LAZY.getDisplay() );
+    key.add( String.valueOf(FieldFlag.BINARY.getAbbreviation()), FieldFlag.BINARY.getDisplay() );
+    key.add( String.valueOf(FieldFlag.COMPRESSED.getAbbreviation()), FieldFlag.COMPRESSED.getDisplay() );
+    key.add( String.valueOf(FieldFlag.SORT_MISSING_FIRST.getAbbreviation()), FieldFlag.SORT_MISSING_FIRST.getDisplay() );
+    key.add( String.valueOf(FieldFlag.SORT_MISSING_LAST.getAbbreviation()), FieldFlag.SORT_MISSING_LAST.getDisplay() );
     return key;
   }
   
@@ -372,7 +367,8 @@
       SimpleOrderedMap<Object> field = new SimpleOrderedMap<Object>();
       field.add( "fields", typeusemap.get( ft.getTypeName() ) );
       field.add( "tokenized", ft.isTokenized() );
-      field.add( "analyzer", ft.getAnalyzer()+"" );
+      field.add("className", ft.getClass().getName());
+      field.add( "analyzer", ft.getAnalyzer().getClass().getName());
       types.add( ft.getTypeName(), field );
     }