[MINDEXER-118] Eliminate use of deprecated Lucene API - Field

Refactor to avoid using the following deprecated symbols:
 * Field.Index
 * Field.TermVector
 * Token

These symbols only exist to support transitioning from pre-4.0
Lucene APIs, so this will make it easier to move to newer Lucenes
in the future.

Signed-off-by: Mat Booth <mat.booth@redhat.com>
diff --git a/indexer-core/src/main/java/org/apache/maven/index/ArtifactContext.java b/indexer-core/src/main/java/org/apache/maven/index/ArtifactContext.java
index a720028..18a5e94 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/ArtifactContext.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/ArtifactContext.java
@@ -28,8 +28,7 @@
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.StoredField;
 import org.apache.maven.index.artifact.Gav;
 import org.apache.maven.index.context.IndexCreator;
 import org.apache.maven.index.context.IndexingContext;
@@ -166,10 +165,10 @@
         Document doc = new Document();
 
         // unique key
-        doc.add( new Field( ArtifactInfo.UINFO, getArtifactInfo().getUinfo(), Store.YES, Index.NOT_ANALYZED ) );
+        doc.add( new Field( ArtifactInfo.UINFO, getArtifactInfo().getUinfo(), IndexerField.KEYWORD_STORED ) );
 
-        doc.add( new Field( ArtifactInfo.LAST_MODIFIED, //
-            Long.toString( System.currentTimeMillis() ), Store.YES, Index.NO ) );
+        doc.add( new StoredField( ArtifactInfo.LAST_MODIFIED, //
+            Long.toString( System.currentTimeMillis() ) ) );
 
         for ( IndexCreator indexCreator : context.getIndexCreators() )
         {
diff --git a/indexer-core/src/main/java/org/apache/maven/index/ArtifactInfoRecord.java b/indexer-core/src/main/java/org/apache/maven/index/ArtifactInfoRecord.java
index 9e65d53..f1bfe85 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/ArtifactInfoRecord.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/ArtifactInfoRecord.java
@@ -22,8 +22,7 @@
 import java.io.Serializable;
 import java.util.regex.Pattern;
 
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.StoredField;
 
 /**
  * Pulling out ArtifactInfo, clearing up. TBD. This gonna be extensible "map-like" class with fields.
@@ -53,14 +52,13 @@
      * Unique groupId, artifactId, version, classifier, extension (or packaging). Stored, indexed untokenized
      */
     public static final IndexerField FLD_UINFO = new IndexerField( NEXUS.UINFO, IndexerFieldVersion.V1, "u",
-        "Artifact UINFO (as keyword, stored)", Store.YES, Index.NOT_ANALYZED );
+        "Artifact UINFO (as keyword, stored)", IndexerField.KEYWORD_STORED );
 
     /**
      * Del: contains UINFO to mark record as deleted (needed for incremental updates!). The original document IS
      * removed, but this marker stays on index to note that fact.
      */
     public static final IndexerField FLD_DELETED = new IndexerField( NEXUS.DELETED, IndexerFieldVersion.V1, "del",
-        "Deleted field, will contain UINFO if document is deleted from index (not indexed, stored)", Store.YES,
-        Index.NO );
+        "Deleted field, will contain UINFO if document is deleted from index (not indexed, stored)", StoredField.TYPE );
 
 }
diff --git a/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexerEngine.java b/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexerEngine.java
index ba234eb..64faa77 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexerEngine.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/DefaultIndexerEngine.java
@@ -27,7 +27,7 @@
 import java.util.Set;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
+import org.apache.lucene.document.StoredField;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.index.Term;
@@ -100,9 +100,9 @@
             // add artifact deletion marker
             final Document doc = new Document();
 
-            doc.add( new Field( ArtifactInfo.DELETED, uinfo, Field.Store.YES, Field.Index.NO ) );
-            doc.add( new Field( ArtifactInfo.LAST_MODIFIED, //
-                Long.toString( System.currentTimeMillis() ), Field.Store.YES, Field.Index.NO ) );
+            doc.add( new StoredField( ArtifactInfo.DELETED, uinfo ) );
+            doc.add( new StoredField( ArtifactInfo.LAST_MODIFIED, //
+                Long.toString( System.currentTimeMillis() ) ) );
 
             IndexWriter w = context.getIndexWriter();
             w.addDocument( doc );
diff --git a/indexer-core/src/main/java/org/apache/maven/index/IndexerField.java b/indexer-core/src/main/java/org/apache/maven/index/IndexerField.java
index bf99c97..3d67b2a 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/IndexerField.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/IndexerField.java
@@ -20,9 +20,8 @@
  */
 
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
-import org.apache.lucene.document.Field.TermVector;
+import org.apache.lucene.document.FieldType;
+import org.apache.lucene.index.IndexOptions;
 
 /**
  * Holds basic information about Indexer field, how it is stored. To keep this centralized, and not spread across code.
@@ -38,21 +37,45 @@
 
     private final String key;
 
-    private final Store storeMethod;
+    private final FieldType fieldType;
 
-    private final Index indexMethod;
+    /** Indexed, not tokenized, not stored. */
+    public static final FieldType KEYWORD_NOT_STORED = new FieldType();
 
-    private final TermVector termVector;
+    /** Indexed, not tokenized, stored. */
+    public static final FieldType KEYWORD_STORED = new FieldType();
 
-    public IndexerField( final org.apache.maven.index.Field ontology, final IndexerFieldVersion version,
-                         final String key, final String description, final Store storeMethod, final Index indexMethod )
+    /** Indexed, tokenized, not stored. */
+    public static final FieldType ANALYZED_NOT_STORED = new FieldType();
+
+    /** Indexed, tokenized, stored. */
+    public static final FieldType ANALYZED_STORED = new FieldType();
+
+    static
     {
-        this( ontology, version, key, description, storeMethod, indexMethod, null );
+        KEYWORD_NOT_STORED.setIndexOptions( IndexOptions.DOCS_AND_FREQS_AND_POSITIONS );
+        KEYWORD_NOT_STORED.setStored( false );
+        KEYWORD_NOT_STORED.setTokenized( false );
+        KEYWORD_NOT_STORED.freeze();
+
+        KEYWORD_STORED.setIndexOptions( IndexOptions.DOCS_AND_FREQS_AND_POSITIONS );
+        KEYWORD_STORED.setStored( true );
+        KEYWORD_STORED.setTokenized( false );
+        KEYWORD_STORED.freeze();
+
+        ANALYZED_NOT_STORED.setIndexOptions( IndexOptions.DOCS_AND_FREQS_AND_POSITIONS );
+        ANALYZED_NOT_STORED.setStored( false );
+        ANALYZED_NOT_STORED.setTokenized( true );
+        ANALYZED_NOT_STORED.freeze();
+
+        ANALYZED_STORED.setIndexOptions( IndexOptions.DOCS_AND_FREQS_AND_POSITIONS );
+        ANALYZED_STORED.setStored( true );
+        ANALYZED_STORED.setTokenized( true );
+        ANALYZED_STORED.freeze();
     }
 
     public IndexerField( final org.apache.maven.index.Field ontology, final IndexerFieldVersion version,
-                         final String key, final String description, final Store storeMethod, final Index indexMethod,
-                         final TermVector termVector )
+            final String key, final String description, final FieldType fieldType )
     {
         this.ontology = ontology;
 
@@ -60,11 +83,7 @@
 
         this.key = key;
 
-        this.storeMethod = storeMethod;
-
-        this.indexMethod = indexMethod;
-
-        this.termVector = termVector;
+        this.fieldType = fieldType;
 
         ontology.addIndexerField( this );
     }
@@ -84,55 +103,28 @@
         return key;
     }
 
-    public Field.Store getStoreMethod()
+    public FieldType getFieldType()
     {
-        return storeMethod;
-    }
-
-    public Field.Index getIndexMethod()
-    {
-        return indexMethod;
-    }
-
-    public Field.TermVector getTermVector()
-    {
-        return termVector;
+        return fieldType;
     }
 
     public boolean isIndexed()
     {
-        return !Index.NO.equals( indexMethod );
+        return fieldType.indexOptions() != IndexOptions.NONE;
     }
 
     public boolean isKeyword()
     {
-        return isIndexed() && !Index.ANALYZED.equals( indexMethod );
+        return isIndexed() && !fieldType.tokenized();
     }
 
     public boolean isStored()
     {
-        return !( Store.NO.equals( storeMethod ) );
+        return fieldType.stored();
     }
 
     public Field toField( String value )
     {
-        Field result;
-
-        if ( getTermVector() != null )
-        {
-            result = new Field( getKey(), value, getStoreMethod(), getIndexMethod(), getTermVector() );
-        }
-        else
-        {
-            result = new Field( getKey(), value, getStoreMethod(), getIndexMethod() );
-        }
-
-        // if ( isKeyword() )
-        // {
-        // result.setOmitNorms( true );
-        // result.setOmitTf( true );
-        // }
-
-        return result;
+        return new Field( getKey(), value, getFieldType() );
     }
 }
diff --git a/indexer-core/src/main/java/org/apache/maven/index/OneLineFragmenter.java b/indexer-core/src/main/java/org/apache/maven/index/OneLineFragmenter.java
index d346a04..d0c9af3 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/OneLineFragmenter.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/OneLineFragmenter.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import org.apache.lucene.analysis.Token;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.search.highlight.Fragmenter;
 
@@ -33,16 +32,6 @@
         setText( originalText );
     }
 
-    public boolean isNewFragment( Token nextToken )
-    {
-        // text: /org/sonatype/...
-        // tokens: org sonatype
-        boolean result =
-            isNewline( getChar( nextToken.startOffset() - 1 ) ) || isNewline( getChar( nextToken.startOffset() - 2 ) );
-
-        return result;
-    }
-
     protected boolean isNewline( char c )
     {
         return c == '\n';
diff --git a/indexer-core/src/main/java/org/apache/maven/index/context/DefaultIndexingContext.java b/indexer-core/src/main/java/org/apache/maven/index/context/DefaultIndexingContext.java
index 6a092c1..8a64a4d 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/context/DefaultIndexingContext.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/context/DefaultIndexingContext.java
@@ -33,9 +33,11 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
+
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.document.StoredField;
 import org.apache.lucene.index.CorruptIndexException;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
@@ -55,6 +57,7 @@
 import org.apache.lucene.store.LockObtainFailedException;
 import org.apache.lucene.util.Bits;
 import org.apache.maven.index.ArtifactInfo;
+import org.apache.maven.index.IndexerField;
 import org.apache.maven.index.artifact.GavCalculator;
 import org.apache.maven.index.artifact.M2GavCalculator;
 import org.codehaus.plexus.util.StringUtils;
@@ -363,10 +366,9 @@
     {
         Document hdr = new Document();
 
-        hdr.add( new Field( FLD_DESCRIPTOR, FLD_DESCRIPTOR_CONTENTS, Field.Store.YES, Field.Index.NOT_ANALYZED ) );
+        hdr.add( new Field( FLD_DESCRIPTOR, FLD_DESCRIPTOR_CONTENTS, IndexerField.KEYWORD_STORED ) );
 
-        hdr.add( new Field( FLD_IDXINFO, VERSION + ArtifactInfo.FS + getRepositoryId(), Field.Store.YES,
-                            Field.Index.NO ) );
+        hdr.add( new StoredField( FLD_IDXINFO, VERSION + ArtifactInfo.FS + getRepositoryId() ) );
 
         IndexWriter w = getIndexWriter();
 
@@ -876,10 +878,8 @@
                                              String listField )
     {
         final Document groupDoc = new Document();
-        groupDoc.add( new Field( field, //
-            fieldValue, Field.Store.YES, Field.Index.NOT_ANALYZED ) );
-        groupDoc.add( new Field( listField, //
-            ArtifactInfo.lst2str( groups ), Field.Store.YES, Field.Index.NO ) );
+        groupDoc.add( new Field( field, fieldValue, IndexerField.KEYWORD_STORED ) );
+        groupDoc.add( new StoredField( listField, ArtifactInfo.lst2str( groups ) ) );
         return groupDoc;
     }
 
diff --git a/indexer-core/src/main/java/org/apache/maven/index/context/IndexUtils.java b/indexer-core/src/main/java/org/apache/maven/index/context/IndexUtils.java
index cd676ff..f7ef771 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/context/IndexUtils.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/context/IndexUtils.java
@@ -29,6 +29,7 @@
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.document.StoredField;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.Directory;
@@ -36,6 +37,7 @@
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
 import org.apache.maven.index.ArtifactInfo;
+import org.apache.maven.index.IndexerField;
 import org.codehaus.plexus.util.FileUtils;
 
 public class IndexUtils
@@ -149,12 +151,12 @@
         Document document = new Document();
 
         // unique key
-        document.add( new Field( ArtifactInfo.UINFO, ai.getUinfo(), Field.Store.YES, Field.Index.NOT_ANALYZED ) );
+        document.add( new Field( ArtifactInfo.UINFO, ai.getUinfo(), IndexerField.KEYWORD_STORED ) );
 
         if ( updateLastModified || doc.getField( ArtifactInfo.LAST_MODIFIED ) == null )
         {
-            document.add( new Field( ArtifactInfo.LAST_MODIFIED, //
-                Long.toString( System.currentTimeMillis() ), Field.Store.YES, Field.Index.NO ) );
+            document.add( new StoredField( ArtifactInfo.LAST_MODIFIED, //
+                Long.toString( System.currentTimeMillis() ) ) );
         }
         else
         {
diff --git a/indexer-core/src/main/java/org/apache/maven/index/creator/JarFileContentsIndexCreator.java b/indexer-core/src/main/java/org/apache/maven/index/creator/JarFileContentsIndexCreator.java
index e1499c8..3b1fe06 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/creator/JarFileContentsIndexCreator.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/creator/JarFileContentsIndexCreator.java
@@ -28,8 +28,6 @@
 import java.util.List;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
 import org.apache.maven.index.ArtifactContext;
 import org.apache.maven.index.ArtifactInfo;
 import org.apache.maven.index.IndexerField;
@@ -52,7 +50,7 @@
     public static final String ID = "jarContent";
 
     public static final IndexerField FLD_CLASSNAMES = new IndexerField( MAVEN.CLASSNAMES, IndexerFieldVersion.V3,
-        "classnames", "Artifact Classes (tokenized)", Store.NO, Index.ANALYZED );
+        "classnames", "Artifact Classes (tokenized)", IndexerField.ANALYZED_NOT_STORED );
 
     /**
      * NexusAnalyzer makes exception with this field only, to keep backward compatibility with old consumers of
@@ -60,7 +58,7 @@
      * registered BEFORE FLD_CLASSNAMES_KW!
      */
     public static final IndexerField FLD_CLASSNAMES_KW = new IndexerField( MAVEN.CLASSNAMES, IndexerFieldVersion.V1,
-        "c", "Artifact Classes (tokenized on newlines only)", Store.YES, Index.ANALYZED );
+        "c", "Artifact Classes (tokenized on newlines only)", IndexerField.ANALYZED_STORED );
 
     public JarFileContentsIndexCreator()
     {
diff --git a/indexer-core/src/main/java/org/apache/maven/index/creator/MavenPluginArtifactInfoIndexCreator.java b/indexer-core/src/main/java/org/apache/maven/index/creator/MavenPluginArtifactInfoIndexCreator.java
index 71e18d9..694ad1a 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/creator/MavenPluginArtifactInfoIndexCreator.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/creator/MavenPluginArtifactInfoIndexCreator.java
@@ -31,8 +31,6 @@
 import java.util.Collection;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
 import org.apache.maven.index.ArtifactContext;
 import org.apache.maven.index.ArtifactInfo;
 import org.apache.maven.index.IndexerField;
@@ -61,10 +59,10 @@
     private static final String MAVEN_PLUGIN_PACKAGING = "maven-plugin";
 
     public static final IndexerField FLD_PLUGIN_PREFIX = new IndexerField( MAVEN.PLUGIN_PREFIX, IndexerFieldVersion.V1,
-        "px", "MavenPlugin prefix (as keyword, stored)", Store.YES, Index.NOT_ANALYZED );
+        "px", "MavenPlugin prefix (as keyword, stored)", IndexerField.KEYWORD_STORED );
 
     public static final IndexerField FLD_PLUGIN_GOALS = new IndexerField( MAVEN.PLUGIN_GOALS, IndexerFieldVersion.V1,
-        "gx", "MavenPlugin goals (as keyword, stored)", Store.YES, Index.ANALYZED );
+        "gx", "MavenPlugin goals (as keyword, stored)", IndexerField.ANALYZED_STORED );
 
     public MavenPluginArtifactInfoIndexCreator()
     {
diff --git a/indexer-core/src/main/java/org/apache/maven/index/creator/MinimalArtifactInfoIndexCreator.java b/indexer-core/src/main/java/org/apache/maven/index/creator/MinimalArtifactInfoIndexCreator.java
index feea2d2..d899705 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/creator/MinimalArtifactInfoIndexCreator.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/creator/MinimalArtifactInfoIndexCreator.java
@@ -28,8 +28,7 @@
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.StoredField;
 import org.apache.maven.index.ArtifactAvailability;
 import org.apache.maven.index.ArtifactContext;
 import org.apache.maven.index.ArtifactInfo;
@@ -67,46 +66,46 @@
      * Info: packaging, lastModified, size, sourcesExists, javadocExists, signatureExists. Stored, not indexed.
      */
     public static final IndexerField FLD_INFO = new IndexerField( NEXUS.INFO, IndexerFieldVersion.V1, "i",
-        "Artifact INFO (not indexed, stored)", Store.YES, Index.NO );
+        "Artifact INFO (not indexed, stored)", StoredField.TYPE );
 
     public static final IndexerField FLD_GROUP_ID_KW = new IndexerField( MAVEN.GROUP_ID, IndexerFieldVersion.V1, "g",
-        "Artifact GroupID (as keyword)", Store.NO, Index.NOT_ANALYZED );
+        "Artifact GroupID (as keyword)", IndexerField.KEYWORD_NOT_STORED );
 
     public static final IndexerField FLD_GROUP_ID = new IndexerField( MAVEN.GROUP_ID, IndexerFieldVersion.V3,
-        "groupId", "Artifact GroupID (tokenized)", Store.NO, Index.ANALYZED );
+        "groupId", "Artifact GroupID (tokenized)", IndexerField.ANALYZED_NOT_STORED );
 
     public static final IndexerField FLD_ARTIFACT_ID_KW = new IndexerField( MAVEN.ARTIFACT_ID, IndexerFieldVersion.V1,
-        "a", "Artifact ArtifactID (as keyword)", Store.NO, Index.NOT_ANALYZED );
+        "a", "Artifact ArtifactID (as keyword)", IndexerField.KEYWORD_NOT_STORED );
 
     public static final IndexerField FLD_ARTIFACT_ID = new IndexerField( MAVEN.ARTIFACT_ID, IndexerFieldVersion.V3,
-        "artifactId", "Artifact ArtifactID (tokenized)", Store.NO, Index.ANALYZED );
+        "artifactId", "Artifact ArtifactID (tokenized)", IndexerField.ANALYZED_NOT_STORED );
 
     public static final IndexerField FLD_VERSION_KW = new IndexerField( MAVEN.VERSION, IndexerFieldVersion.V1, "v",
-        "Artifact Version (as keyword)", Store.NO, Index.NOT_ANALYZED );
+        "Artifact Version (as keyword)", IndexerField.KEYWORD_NOT_STORED );
 
     public static final IndexerField FLD_VERSION = new IndexerField( MAVEN.VERSION, IndexerFieldVersion.V3, "version",
-        "Artifact Version (tokenized)", Store.NO, Index.ANALYZED );
+        "Artifact Version (tokenized)", IndexerField.ANALYZED_NOT_STORED );
 
     public static final IndexerField FLD_PACKAGING = new IndexerField( MAVEN.PACKAGING, IndexerFieldVersion.V1, "p",
-        "Artifact Packaging (as keyword)", Store.NO, Index.NOT_ANALYZED );
+        "Artifact Packaging (as keyword)", IndexerField.KEYWORD_NOT_STORED );
 
     public static final IndexerField FLD_EXTENSION = new IndexerField( MAVEN.EXTENSION, IndexerFieldVersion.V1, "e",
-        "Artifact extension (as keyword)", Store.NO, Index.NOT_ANALYZED );
+        "Artifact extension (as keyword)", IndexerField.KEYWORD_NOT_STORED );
 
     public static final IndexerField FLD_CLASSIFIER = new IndexerField( MAVEN.CLASSIFIER, IndexerFieldVersion.V1, "l",
-        "Artifact classifier (as keyword)", Store.NO, Index.NOT_ANALYZED );
+        "Artifact classifier (as keyword)", IndexerField.KEYWORD_NOT_STORED );
 
     public static final IndexerField FLD_NAME = new IndexerField( MAVEN.NAME, IndexerFieldVersion.V1, "n",
-        "Artifact name (tokenized, stored)", Store.YES, Index.ANALYZED );
+        "Artifact name (tokenized, stored)", IndexerField.ANALYZED_STORED );
 
     public static final IndexerField FLD_DESCRIPTION = new IndexerField( MAVEN.DESCRIPTION, IndexerFieldVersion.V1,
-        "d", "Artifact description (tokenized, stored)", Store.YES, Index.ANALYZED );
+        "d", "Artifact description (tokenized, stored)", IndexerField.ANALYZED_STORED );
 
     public static final IndexerField FLD_LAST_MODIFIED = new IndexerField( MAVEN.LAST_MODIFIED, IndexerFieldVersion.V1,
-        "m", "Artifact last modified (not indexed, stored)", Store.YES, Index.NO );
+        "m", "Artifact last modified (not indexed, stored)", StoredField.TYPE );
 
     public static final IndexerField FLD_SHA1 = new IndexerField( MAVEN.SHA1, IndexerFieldVersion.V1, "1",
-        "Artifact SHA1 checksum (as keyword, stored)", Store.YES, Index.NOT_ANALYZED );
+        "Artifact SHA1 checksum (as keyword, stored)", IndexerField.KEYWORD_STORED );
 
     private Locator jl = new JavadocLocator();
 
@@ -310,18 +309,16 @@
         // legacy!
         if ( ai.getPrefix() != null )
         {
-            doc.add( new Field( ArtifactInfo.PLUGIN_PREFIX, ai.getPrefix(), Field.Store.YES,
-                                Field.Index.NOT_ANALYZED ) );
+            doc.add( new Field( ArtifactInfo.PLUGIN_PREFIX, ai.getPrefix(), IndexerField.KEYWORD_STORED ) );
         }
 
         if ( ai.getGoals() != null )
         {
-            doc.add( new Field( ArtifactInfo.PLUGIN_GOALS, ArtifactInfo.lst2str( ai.getGoals() ), Field.Store.YES,
-                Field.Index.NO ) );
+            doc.add( new StoredField( ArtifactInfo.PLUGIN_GOALS, ArtifactInfo.lst2str( ai.getGoals() ) ) );
         }
 
         doc.removeField( ArtifactInfo.GROUP_ID );
-        doc.add( new Field( ArtifactInfo.GROUP_ID, ai.getGroupId(), Field.Store.NO, Field.Index.NOT_ANALYZED ) );
+        doc.add( new Field( ArtifactInfo.GROUP_ID, ai.getGroupId(), IndexerField.KEYWORD_NOT_STORED ) );
     }
 
     public boolean updateArtifactInfo( Document doc, ArtifactInfo ai )
diff --git a/indexer-core/src/main/java/org/apache/maven/index/creator/OsgiArtifactIndexCreator.java b/indexer-core/src/main/java/org/apache/maven/index/creator/OsgiArtifactIndexCreator.java
index ed06d0b..559d2da 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/creator/OsgiArtifactIndexCreator.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/creator/OsgiArtifactIndexCreator.java
@@ -23,7 +23,6 @@
 import javax.inject.Singleton;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
 import org.apache.maven.index.ArtifactContext;
 import org.apache.maven.index.ArtifactInfo;
 import org.apache.maven.index.IndexerField;
@@ -72,95 +71,95 @@
 
     public static final IndexerField FLD_SHA256 =
         new IndexerField( OSGI.SHA256, IndexerFieldVersion.V4, "sha256", "SHA-256 (not analyzed, stored)",
-                          Field.Store.YES, Field.Index.NOT_ANALYZED );
+                          IndexerField.KEYWORD_STORED );
 
     private static final String BSN = "Bundle-SymbolicName";
 
     public static final IndexerField FLD_BUNDLE_SYMBOLIC_NAME =
         new IndexerField( OSGI.SYMBOLIC_NAME, IndexerFieldVersion.V4, BSN, "Bundle-SymbolicName (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BV = "Bundle-Version";
 
     public static final IndexerField FLD_BUNDLE_VERSION =
-        new IndexerField( OSGI.VERSION, IndexerFieldVersion.V4, BV, "Bundle-Version (indexed, stored)", Field.Store.YES,
-                          Field.Index.ANALYZED );
+        new IndexerField( OSGI.VERSION, IndexerFieldVersion.V4, BV, "Bundle-Version (indexed, stored)",
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BEP = "Export-Package";
 
     public static final IndexerField FLD_BUNDLE_EXPORT_PACKAGE =
         new IndexerField( OSGI.EXPORT_PACKAGE, IndexerFieldVersion.V4, BEP, "Export-Package (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
     @Deprecated
     private static final String BES = "Export-Service";
     @Deprecated
     public static final IndexerField FLD_BUNDLE_EXPORT_SERVIVE =
         new IndexerField( OSGI.EXPORT_SERVICE, IndexerFieldVersion.V4, BES, "Export-Service (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BD = "Bundle-Description";
 
     public static final IndexerField FLD_BUNDLE_DESCRIPTION =
         new IndexerField( OSGI.DESCRIPTION, IndexerFieldVersion.V4, BD, "Bundle-Description (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BN = "Bundle-Name";
 
     public static final IndexerField FLD_BUNDLE_NAME =
-        new IndexerField( OSGI.NAME, IndexerFieldVersion.V4, BN, "Bundle-Name (indexed, stored)", Field.Store.YES,
-                          Field.Index.ANALYZED );
+        new IndexerField( OSGI.NAME, IndexerFieldVersion.V4, BN, "Bundle-Name (indexed, stored)",
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BL = "Bundle-License";
 
     public static final IndexerField FLD_BUNDLE_LICENSE =
-        new IndexerField( OSGI.LICENSE, IndexerFieldVersion.V4, BL, "Bundle-License (indexed, stored)", Field.Store.YES,
-                          Field.Index.ANALYZED );
+        new IndexerField( OSGI.LICENSE, IndexerFieldVersion.V4, BL, "Bundle-License (indexed, stored)",
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BDU = "Bundle-DocURL";
 
     public static final IndexerField FLD_BUNDLE_DOCURL =
-        new IndexerField( OSGI.DOCURL, IndexerFieldVersion.V4, BDU, "Bundle-DocURL (indexed, stored)", Field.Store.YES,
-                          Field.Index.ANALYZED );
+        new IndexerField( OSGI.DOCURL, IndexerFieldVersion.V4, BDU, "Bundle-DocURL (indexed, stored)",
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BIP = "Import-Package";
 
     public static final IndexerField FLD_BUNDLE_IMPORT_PACKAGE =
         new IndexerField( OSGI.IMPORT_PACKAGE, IndexerFieldVersion.V4, BIP, "Import-Package (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
 
     private static final String BRB = "Require-Bundle";
 
     public static final IndexerField FLD_BUNDLE_REQUIRE_BUNDLE =
         new IndexerField( OSGI.REQUIRE_BUNDLE, IndexerFieldVersion.V4, BRB, "Require-Bundle (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
     private static final String PROVIDE_CAPABILITY = "Provide-Capability";
 
     public static final IndexerField FLD_BUNDLE_PROVIDE_CAPABILITY =
         new IndexerField( OSGI.PROVIDE_CAPABILITY, IndexerFieldVersion.V4, PROVIDE_CAPABILITY,
-                          "Provide-Capability (indexed, stored)", Field.Store.YES, Field.Index.ANALYZED );
+                          "Provide-Capability (indexed, stored)", IndexerField.ANALYZED_STORED );
 
     private static final String REQUIRE_CAPABILITY = "Require-Capability";
 
     public static final IndexerField FLD_BUNDLE_REQUIRE_CAPABILITY =
         new IndexerField( OSGI.REQUIRE_CAPABILITY, IndexerFieldVersion.V4, REQUIRE_CAPABILITY,
-                          "Require-Capability (indexed, stored)", Field.Store.YES, Field.Index.ANALYZED );
+                          "Require-Capability (indexed, stored)", IndexerField.ANALYZED_STORED );
 
     private static final String FRAGMENT_HOST = "Fragment-Host";
 
     public static final IndexerField FLD_BUNDLE_FRAGMENT_HOST =
         new IndexerField( OSGI.FRAGMENT_HOST, IndexerFieldVersion.V4, FRAGMENT_HOST, "Fragment-Host (indexed, stored)",
-                          Field.Store.YES, Field.Index.ANALYZED );
+                          IndexerField.ANALYZED_STORED );
 
     private static final String BUNDLE_REQUIRED_EXECUTION_ENVIRONMENT = "Bundle-RequiredExecutionEnvironment";
 
     public static final IndexerField FLD_BUNDLE_REQUIRED_EXECUTION_ENVIRONMENT =
         new IndexerField( OSGI.BUNDLE_REQUIRED_EXECUTION_ENVIRONMENT, IndexerFieldVersion.V4,
                           BUNDLE_REQUIRED_EXECUTION_ENVIRONMENT,
-                          "Bundle-RequiredExecutionEnvironment (indexed, stored)", Field.Store.YES,
-                          Field.Index.ANALYZED );
+                          "Bundle-RequiredExecutionEnvironment (indexed, stored)",
+                          IndexerField.ANALYZED_STORED );
 
 
     public Collection<IndexerField> getIndexerFields()
diff --git a/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataReader.java b/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataReader.java
index 67f823d..c5f1d71 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataReader.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataReader.java
@@ -34,8 +34,8 @@
 import java.util.Set;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Field.Index;
-import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.FieldType;
+import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.maven.index.ArtifactInfo;
 import org.apache.maven.index.context.IndexUtils;
@@ -181,23 +181,20 @@
     {
         int flags = dis.read();
 
-        Index index = Index.NO;
+        FieldType fieldType = new FieldType();
         if ( ( flags & IndexDataWriter.F_INDEXED ) > 0 )
         {
-            boolean isTokenized = ( flags & IndexDataWriter.F_TOKENIZED ) > 0;
-            index = isTokenized ? Index.ANALYZED : Index.NOT_ANALYZED;
+            boolean tokenized = ( flags & IndexDataWriter.F_TOKENIZED ) > 0;
+            fieldType.setTokenized( tokenized );
+            fieldType.setOmitNorms( !tokenized );
+            fieldType.setIndexOptions( IndexOptions.DOCS_AND_FREQS_AND_POSITIONS );
         }
-
-        Store store = Store.NO;
-        if ( ( flags & IndexDataWriter.F_STORED ) > 0 )
-        {
-            store = Store.YES;
-        }
+        fieldType.setStored( ( flags & IndexDataWriter.F_STORED ) > 0 );
 
         String name = dis.readUTF();
         String value = readUTF( dis );
 
-        return new Field( name, value, store, index );
+        return new Field( name, value, fieldType );
     }
 
     private static String readUTF( DataInput in )
diff --git a/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataWriter.java b/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataWriter.java
index 979474d..11550bd 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataWriter.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/updater/IndexDataWriter.java
@@ -31,14 +31,14 @@
 import java.util.Set;
 import java.util.zip.GZIPOutputStream;
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field.Store;
-import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.Field;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.index.MultiFields;
 import org.apache.lucene.util.Bits;
 import org.apache.maven.index.ArtifactInfo;
+import org.apache.maven.index.IndexerField;
 import org.apache.maven.index.context.DefaultIndexingContext;
 import org.apache.maven.index.context.IndexingContext;
 
@@ -122,18 +122,19 @@
     {
         {
             List<IndexableField> allGroupsFields = new ArrayList<>( 2 );
-            allGroupsFields.add( new StringField( ArtifactInfo.ALL_GROUPS, ArtifactInfo.ALL_GROUPS_VALUE, Store.YES ) );
-            allGroupsFields.add( new StringField( ArtifactInfo.ALL_GROUPS_LIST, ArtifactInfo.lst2str( allGroups ),
-                                                  Store.YES ) );
+            allGroupsFields.add( new Field( ArtifactInfo.ALL_GROUPS, ArtifactInfo.ALL_GROUPS_VALUE,
+                                            IndexerField.KEYWORD_STORED ) );
+            allGroupsFields.add( new Field( ArtifactInfo.ALL_GROUPS_LIST, ArtifactInfo.lst2str( allGroups ),
+                                            IndexerField.KEYWORD_STORED ) );
             writeDocumentFields( allGroupsFields );
         }
 
         {
             List<IndexableField> rootGroupsFields = new ArrayList<>( 2 );
-            rootGroupsFields.add( new StringField( ArtifactInfo.ROOT_GROUPS, ArtifactInfo.ROOT_GROUPS_VALUE,
-                                                   Store.YES ) );
-            rootGroupsFields.add( new StringField( ArtifactInfo.ROOT_GROUPS_LIST, ArtifactInfo.lst2str( rootGroups ),
-                                                   Store.YES ) );
+            rootGroupsFields.add( new Field( ArtifactInfo.ROOT_GROUPS, ArtifactInfo.ROOT_GROUPS_VALUE,
+                                             IndexerField.KEYWORD_STORED ) );
+            rootGroupsFields.add( new Field( ArtifactInfo.ROOT_GROUPS_LIST, ArtifactInfo.lst2str( rootGroups ),
+                                             IndexerField.KEYWORD_STORED ) );
             writeDocumentFields( rootGroupsFields );
         }
     }