diff --git a/src/Lucene.Net/Search/DocTermOrdsRangeFilter.cs b/src/Lucene.Net/Search/DocTermOrdsRangeFilter.cs
index 7f1343e..e2d0d20 100644
--- a/src/Lucene.Net/Search/DocTermOrdsRangeFilter.cs
+++ b/src/Lucene.Net/Search/DocTermOrdsRangeFilter.cs
@@ -125,27 +125,7 @@
 
                 if (Debugging.AssertsEnabled) Debugging.Assert(inclusiveLowerPoint >= 0 && inclusiveUpperPoint >= 0);
 
-                return new FieldCacheDocIdSetAnonymousInnerClassHelper(this, context.AtomicReader.MaxDoc, acceptDocs, docTermOrds, inclusiveLowerPoint, inclusiveUpperPoint);
-            }
-
-            private class FieldCacheDocIdSetAnonymousInnerClassHelper : FieldCacheDocIdSet
-            {
-                private readonly DocTermOrdsRangeFilterAnonymousInnerClassHelper outerInstance;
-
-                private readonly SortedSetDocValues docTermOrds;
-                private readonly long inclusiveLowerPoint;
-                private readonly long inclusiveUpperPoint;
-
-                public FieldCacheDocIdSetAnonymousInnerClassHelper(DocTermOrdsRangeFilterAnonymousInnerClassHelper outerInstance, int maxDoc, IBits acceptDocs, SortedSetDocValues docTermOrds, long inclusiveLowerPoint, long inclusiveUpperPoint)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.outerInstance = outerInstance;
-                    this.docTermOrds = docTermOrds;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override sealed bool MatchDoc(int doc)
+                return new FieldCacheDocIdSet(context.AtomicReader.MaxDoc, acceptDocs, (doc) =>
                 {
                     docTermOrds.SetDocument(doc);
                     long ord;
@@ -161,7 +141,7 @@
                         }
                     }
                     return false;
-                }
+                });
             }
         }
 
diff --git a/src/Lucene.Net/Search/DocTermOrdsRewriteMethod.cs b/src/Lucene.Net/Search/DocTermOrdsRewriteMethod.cs
index ef53a4d..16bf23b 100644
--- a/src/Lucene.Net/Search/DocTermOrdsRewriteMethod.cs
+++ b/src/Lucene.Net/Search/DocTermOrdsRewriteMethod.cs
@@ -113,8 +113,20 @@
                 {
                     return null;
                 }
-
-                return new FieldCacheDocIdSetAnonymousInnerClassHelper(this, context.Reader.MaxDoc, acceptDocs, docTermOrds, termSet);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    docTermOrds.SetDocument(doc);
+                    long ord;
+                    // TODO: we could track max bit set and early terminate (since they come in sorted order)
+                    while ((ord = docTermOrds.NextOrd()) != SortedSetDocValues.NO_MORE_ORDS)
+                    {
+                        if (termSet.Get(ord))
+                        {
+                            return true;
+                        }
+                    }
+                    return false;
+                });
             }
 
             private class TermsAnonymousInnerClassHelper : Terms
@@ -152,37 +164,6 @@
 
                 public override bool HasPayloads => false;
             }
-
-            private class FieldCacheDocIdSetAnonymousInnerClassHelper : FieldCacheDocIdSet
-            {
-                private readonly MultiTermQueryDocTermOrdsWrapperFilter outerInstance;
-
-                private SortedSetDocValues docTermOrds;
-                private Int64BitSet termSet;
-
-                public FieldCacheDocIdSetAnonymousInnerClassHelper(MultiTermQueryDocTermOrdsWrapperFilter outerInstance, int maxDoc, IBits acceptDocs, SortedSetDocValues docTermOrds, Int64BitSet termSet)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.outerInstance = outerInstance;
-                    this.docTermOrds = docTermOrds;
-                    this.termSet = termSet;
-                }
-
-                protected internal override sealed bool MatchDoc(int doc)
-                {
-                    docTermOrds.SetDocument(doc);
-                    long ord;
-                    // TODO: we could track max bit set and early terminate (since they come in sorted order)
-                    while ((ord = docTermOrds.NextOrd()) != SortedSetDocValues.NO_MORE_ORDS)
-                    {
-                        if (termSet.Get(ord))
-                        {
-                            return true;
-                        }
-                    }
-                    return false;
-                }
-            }
         }
 
         public override bool Equals(object obj)
diff --git a/src/Lucene.Net/Search/FieldCacheDocIdSet.cs b/src/Lucene.Net/Search/FieldCacheDocIdSet.cs
index 15cbba7..68ad720 100644
--- a/src/Lucene.Net/Search/FieldCacheDocIdSet.cs
+++ b/src/Lucene.Net/Search/FieldCacheDocIdSet.cs
@@ -1,3 +1,5 @@
+using System;
+
 namespace Lucene.Net.Search
 {
     /*
@@ -31,12 +33,24 @@
     /// <para/>
     /// @lucene.internal
     /// </summary>
-    public abstract class FieldCacheDocIdSet : DocIdSet
+    public class FieldCacheDocIdSet : DocIdSet
     {
         protected readonly int m_maxDoc;
         protected readonly IBits m_acceptDocs;
+        private readonly Predicate<int> matchDoc;
+        private readonly bool hasMatchDoc;
 
-        public FieldCacheDocIdSet(int maxDoc, IBits acceptDocs)
+        // LUCENENET specific - added constructor to allow the class to be used without hand-coding
+        // a subclass by passing a predicate.
+        public FieldCacheDocIdSet(int maxDoc, IBits acceptDocs, Predicate<int> matchDoc)
+        {
+            this.matchDoc = matchDoc ?? throw new ArgumentNullException(nameof(matchDoc));
+            this.hasMatchDoc = true;
+            this.m_maxDoc = maxDoc;
+            this.m_acceptDocs = acceptDocs;
+        }
+
+        protected FieldCacheDocIdSet(int maxDoc, IBits acceptDocs)
         {
             this.m_maxDoc = maxDoc;
             this.m_acceptDocs = acceptDocs;
@@ -45,7 +59,7 @@
         /// <summary>
         /// This method checks, if a doc is a hit
         /// </summary>
-        protected internal abstract bool MatchDoc(int doc);
+        protected internal virtual bool MatchDoc(int doc) => hasMatchDoc && matchDoc(doc);
 
         /// <summary>
         /// This DocIdSet is always cacheable (does not go back
diff --git a/src/Lucene.Net/Search/FieldCacheRangeFilter.cs b/src/Lucene.Net/Search/FieldCacheRangeFilter.cs
index 716ba77..76dcdb9 100644
--- a/src/Lucene.Net/Search/FieldCacheRangeFilter.cs
+++ b/src/Lucene.Net/Search/FieldCacheRangeFilter.cs
@@ -65,27 +65,6 @@
 #endif
         private class AnonymousStringFieldCacheRangeFilter : FieldCacheRangeFilter<string>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private SortedDocValues fcsi;
-                private int inclusiveLowerPoint;
-                private int inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(SortedDocValues fcsi, int inclusiveLowerPoint, int inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.fcsi = fcsi;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    int docOrd = fcsi.GetOrd(doc);
-                    return docOrd >= inclusiveLowerPoint && docOrd <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousStringFieldCacheRangeFilter(string field, string lowerVal, string upperVal, bool includeLower, bool includeUpper)
                 : base(field, null, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -144,7 +123,11 @@
 
                 if (Debugging.AssertsEnabled) Debugging.Assert(inclusiveLowerPoint >= 0 && inclusiveUpperPoint >= 0);
 
-                return new AnonymousClassFieldCacheDocIdSet(fcsi, inclusiveLowerPoint, inclusiveUpperPoint, context.Reader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    int docOrd = fcsi.GetOrd(doc);
+                    return docOrd >= inclusiveLowerPoint && docOrd <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -153,27 +136,6 @@
 #endif
         private class AnonymousBytesRefFieldCacheRangeFilter : FieldCacheRangeFilter<BytesRef>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private SortedDocValues fcsi;
-                private int inclusiveLowerPoint;
-                private int inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(SortedDocValues fcsi, int inclusiveLowerPoint, int inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.fcsi = fcsi;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    int docOrd = fcsi.GetOrd(doc);
-                    return docOrd >= inclusiveLowerPoint && docOrd <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousBytesRefFieldCacheRangeFilter(string field, BytesRef lowerVal, BytesRef upperVal, bool includeLower, bool includeUpper)
                 : base(field, null, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -232,7 +194,11 @@
 
                 if (Debugging.AssertsEnabled) Debugging.Assert(inclusiveLowerPoint >= 0 && inclusiveUpperPoint >= 0);
 
-                return new AnonymousClassFieldCacheDocIdSet(fcsi, inclusiveLowerPoint, inclusiveUpperPoint, context.AtomicReader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.AtomicReader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    int docOrd = fcsi.GetOrd(doc);
+                    return docOrd >= inclusiveLowerPoint && docOrd <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -241,27 +207,6 @@
 #endif
         private class AnonymousSbyteFieldCacheRangeFilter : FieldCacheRangeFilter<sbyte?>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private FieldCache.Bytes values;
-                private sbyte inclusiveLowerPoint;
-                private sbyte inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(FieldCache.Bytes values, sbyte inclusiveLowerPoint, sbyte inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.values = values;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    sbyte value = (sbyte)values.Get(doc);
-                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousSbyteFieldCacheRangeFilter(string field, FieldCache.IParser parser, sbyte? lowerVal, sbyte? upperVal, bool includeLower, bool includeUpper)
                 : base(field, parser, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -301,7 +246,11 @@
 #pragma warning restore 612, 618
 
                 // we only request the usage of termDocs, if the range contains 0
-                return new AnonymousClassFieldCacheDocIdSet(values, inclusiveLowerPoint, inclusiveUpperPoint, context.AtomicReader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.AtomicReader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    sbyte value = (sbyte)values.Get(doc);
+                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -310,27 +259,6 @@
 #endif
         private class AnonymousInt16FieldCacheRangeFilter : FieldCacheRangeFilter<short?>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private FieldCache.Int16s values;
-                private short inclusiveLowerPoint;
-                private short inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(FieldCache.Int16s values, short inclusiveLowerPoint, short inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.values = values;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    short value = values.Get(doc);
-                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousInt16FieldCacheRangeFilter(string field, FieldCache.IParser parser, short? lowerVal, short? upperVal, bool includeLower, bool includeUpper)
                 : base(field, parser, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -371,7 +299,11 @@
 #pragma warning restore 612, 618
 
                 // we only request the usage of termDocs, if the range contains 0
-                return new AnonymousClassFieldCacheDocIdSet(values, inclusiveLowerPoint, inclusiveUpperPoint, context.Reader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    short value = values.Get(doc);
+                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -380,27 +312,6 @@
 #endif
         private class AnonymousInt32FieldCacheRangeFilter : FieldCacheRangeFilter<int?>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private FieldCache.Int32s values;
-                private int inclusiveLowerPoint;
-                private int inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(FieldCache.Int32s values, int inclusiveLowerPoint, int inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.values = values;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    int value = values.Get(doc);
-                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousInt32FieldCacheRangeFilter(string field, FieldCache.IParser parser, int? lowerVal, int? upperVal, bool includeLower, bool includeUpper)
                 : base(field, parser, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -438,7 +349,11 @@
 
                 FieldCache.Int32s values = FieldCache.DEFAULT.GetInt32s(context.AtomicReader, field, (FieldCache.IInt32Parser)parser, false);
                 // we only request the usage of termDocs, if the range contains 0
-                return new AnonymousClassFieldCacheDocIdSet(values, inclusiveLowerPoint, inclusiveUpperPoint, context.Reader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    int value = values.Get(doc);
+                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -447,27 +362,6 @@
 #endif
         private class AnonymousInt64FieldCacheRangeFilter : FieldCacheRangeFilter<long?>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private FieldCache.Int64s values;
-                private long inclusiveLowerPoint;
-                private long inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(FieldCache.Int64s values, long inclusiveLowerPoint, long inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.values = values;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    long value = values.Get(doc);
-                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousInt64FieldCacheRangeFilter(string field, FieldCache.IParser parser, long? lowerVal, long? upperVal, bool includeLower, bool includeUpper)
                 : base(field, parser, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -505,7 +399,11 @@
 
                 FieldCache.Int64s values = FieldCache.DEFAULT.GetInt64s(context.AtomicReader, field, (FieldCache.IInt64Parser)parser, false);
                 // we only request the usage of termDocs, if the range contains 0
-                return new AnonymousClassFieldCacheDocIdSet(values, inclusiveLowerPoint, inclusiveUpperPoint, context.Reader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    long value = values.Get(doc);
+                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -514,27 +412,6 @@
 #endif
         private class AnonymousSingleFieldCacheRangeFilter : FieldCacheRangeFilter<float?>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private FieldCache.Singles values;
-                private float inclusiveLowerPoint;
-                private float inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(FieldCache.Singles values, float inclusiveLowerPoint, float inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.values = values;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    float value = values.Get(doc);
-                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousSingleFieldCacheRangeFilter(string field, FieldCache.IParser parser, float? lowerVal, float? upperVal, bool includeLower, bool includeUpper)
                 : base(field, parser, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -577,7 +454,11 @@
                 FieldCache.Singles values = FieldCache.DEFAULT.GetSingles(context.AtomicReader, field, (FieldCache.ISingleParser)parser, false);
 
                 // we only request the usage of termDocs, if the range contains 0
-                return new AnonymousClassFieldCacheDocIdSet(values, inclusiveLowerPoint, inclusiveUpperPoint, context.Reader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    float value = values.Get(doc);
+                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
+                });
             }
         }
 
@@ -586,27 +467,6 @@
 #endif
         private class AnonymousDoubleFieldCacheRangeFilter : FieldCacheRangeFilter<double?>
         {
-            private class AnonymousClassFieldCacheDocIdSet : FieldCacheDocIdSet
-            {
-                private FieldCache.Doubles values;
-                private double inclusiveLowerPoint;
-                private double inclusiveUpperPoint;
-
-                internal AnonymousClassFieldCacheDocIdSet(FieldCache.Doubles values, double inclusiveLowerPoint, double inclusiveUpperPoint, int maxDoc, IBits acceptDocs)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.values = values;
-                    this.inclusiveLowerPoint = inclusiveLowerPoint;
-                    this.inclusiveUpperPoint = inclusiveUpperPoint;
-                }
-
-                protected internal override bool MatchDoc(int doc)
-                {
-                    double value = values.Get(doc);
-                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
-                }
-            }
-
             internal AnonymousDoubleFieldCacheRangeFilter(string field, FieldCache.IParser parser, double? lowerVal, double? upperVal, bool includeLower, bool includeUpper)
                 : base(field, parser, lowerVal, upperVal, includeLower, includeUpper)
             {
@@ -649,7 +509,11 @@
                 FieldCache.Doubles values = FieldCache.DEFAULT.GetDoubles(context.AtomicReader, field, (FieldCache.IDoubleParser)parser, false);
 
                 // we only request the usage of termDocs, if the range contains 0
-                return new AnonymousClassFieldCacheDocIdSet(values, inclusiveLowerPoint, inclusiveUpperPoint, context.Reader.MaxDoc, acceptDocs);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    double value = values.Get(doc);
+                    return value >= inclusiveLowerPoint && value <= inclusiveUpperPoint;
+                });
             }
         }
 
diff --git a/src/Lucene.Net/Search/FieldCacheRewriteMethod.cs b/src/Lucene.Net/Search/FieldCacheRewriteMethod.cs
index b81be95..706beaa 100644
--- a/src/Lucene.Net/Search/FieldCacheRewriteMethod.cs
+++ b/src/Lucene.Net/Search/FieldCacheRewriteMethod.cs
@@ -98,7 +98,7 @@
                 SortedDocValues fcsi = FieldCache.DEFAULT.GetTermsIndex((context.AtomicReader), m_query.m_field);
                 // Cannot use FixedBitSet because we require long index (ord):
                 Int64BitSet termSet = new Int64BitSet(fcsi.ValueCount);
-                TermsEnum termsEnum = m_query.GetTermsEnum(new TermsAnonymousInnerClassHelper(this, fcsi));
+                TermsEnum termsEnum = m_query.GetTermsEnum(new TermsAnonymousInnerClassHelper(fcsi));
 
                 if (Debugging.AssertsEnabled) Debugging.Assert(termsEnum != null);
                 if (termsEnum.Next() != null)
@@ -118,18 +118,23 @@
                     return null;
                 }
 
-                return new FieldCacheDocIdSetAnonymousInnerClassHelper(this, context.Reader.MaxDoc, acceptDocs, fcsi, termSet);
+                return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
+                {
+                    int ord = fcsi.GetOrd(doc);
+                    if (ord == -1)
+                    {
+                        return false;
+                    }
+                    return termSet.Get(ord);
+                });
             }
 
             private class TermsAnonymousInnerClassHelper : Terms
             {
-                private readonly MultiTermQueryFieldCacheWrapperFilter outerInstance;
+                private readonly SortedDocValues fcsi;
 
-                private SortedDocValues fcsi;
-
-                public TermsAnonymousInnerClassHelper(MultiTermQueryFieldCacheWrapperFilter outerInstance, SortedDocValues fcsi)
+                public TermsAnonymousInnerClassHelper(SortedDocValues fcsi)
                 {
-                    this.outerInstance = outerInstance;
                     this.fcsi = fcsi;
                 }
 
@@ -156,32 +161,6 @@
 
                 public override bool HasPayloads => false;
             }
-
-            private class FieldCacheDocIdSetAnonymousInnerClassHelper : FieldCacheDocIdSet
-            {
-                private readonly MultiTermQueryFieldCacheWrapperFilter outerInstance;
-
-                private SortedDocValues fcsi;
-                private Int64BitSet termSet;
-
-                public FieldCacheDocIdSetAnonymousInnerClassHelper(MultiTermQueryFieldCacheWrapperFilter outerInstance, int maxDoc, IBits acceptDocs, SortedDocValues fcsi, Int64BitSet termSet)
-                    : base(maxDoc, acceptDocs)
-                {
-                    this.outerInstance = outerInstance;
-                    this.fcsi = fcsi;
-                    this.termSet = termSet;
-                }
-
-                protected internal override sealed bool MatchDoc(int doc)
-                {
-                    int ord = fcsi.GetOrd(doc);
-                    if (ord == -1)
-                    {
-                        return false;
-                    }
-                    return termSet.Get(ord);
-                }
-            }
         }
 
         public override bool Equals(object obj)
diff --git a/src/Lucene.Net/Search/FieldCacheTermsFilter.cs b/src/Lucene.Net/Search/FieldCacheTermsFilter.cs
index 0c4b2fa..2af5265 100644
--- a/src/Lucene.Net/Search/FieldCacheTermsFilter.cs
+++ b/src/Lucene.Net/Search/FieldCacheTermsFilter.cs
@@ -92,11 +92,10 @@
     ///
     /// Which filter is best is very application dependent.
     /// </summary>
-
     public class FieldCacheTermsFilter : Filter
     {
-        private string field;
-        private BytesRef[] terms;
+        private readonly string field;
+        private readonly BytesRef[] terms;
 
         public FieldCacheTermsFilter(string field, params BytesRef[] terms)
         {
@@ -128,25 +127,7 @@
                     bits.Set(ord);
                 }
             }
-            return new FieldCacheDocIdSetAnonymousInnerClassHelper(this, context.Reader.MaxDoc, acceptDocs, fcsi, bits);
-        }
-
-        private class FieldCacheDocIdSetAnonymousInnerClassHelper : FieldCacheDocIdSet
-        {
-            private readonly FieldCacheTermsFilter outerInstance;
-
-            private SortedDocValues fcsi;
-            private FixedBitSet bits;
-
-            public FieldCacheDocIdSetAnonymousInnerClassHelper(FieldCacheTermsFilter outerInstance, int maxDoc, IBits acceptDocs, SortedDocValues fcsi, FixedBitSet bits)
-                : base(maxDoc, acceptDocs)
-            {
-                this.outerInstance = outerInstance;
-                this.fcsi = fcsi;
-                this.bits = bits;
-            }
-
-            protected internal override sealed bool MatchDoc(int doc)
+            return new FieldCacheDocIdSet(context.Reader.MaxDoc, acceptDocs, (doc) =>
             {
                 int ord = fcsi.GetOrd(doc);
                 if (ord == -1)
@@ -158,7 +139,7 @@
                 {
                     return bits.Get(ord);
                 }
-            }
+            });
         }
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net/Search/FieldValueFilter.cs b/src/Lucene.Net/Search/FieldValueFilter.cs
index 91ae83c..c11d1ab 100644
--- a/src/Lucene.Net/Search/FieldValueFilter.cs
+++ b/src/Lucene.Net/Search/FieldValueFilter.cs
@@ -79,7 +79,7 @@
                 {
                     return null;
                 }
-                return new FieldCacheDocIdSetAnonymousInnerClassHelper(this, context.AtomicReader.MaxDoc, acceptDocs, docsWithField);
+                return new FieldCacheDocIdSet(context.AtomicReader.MaxDoc, acceptDocs, (doc) => !docsWithField.Get(doc));
             }
             else
             {
@@ -93,45 +93,7 @@
                     // :-)
                     return BitsFilteredDocIdSet.Wrap((DocIdSet)docsWithField, acceptDocs);
                 }
-                return new FieldCacheDocIdSetAnonymousInnerClassHelper2(this, context.AtomicReader.MaxDoc, acceptDocs, docsWithField);
-            }
-        }
-
-        private class FieldCacheDocIdSetAnonymousInnerClassHelper : FieldCacheDocIdSet
-        {
-            private readonly FieldValueFilter outerInstance;
-
-            private IBits docsWithField;
-
-            public FieldCacheDocIdSetAnonymousInnerClassHelper(FieldValueFilter outerInstance, int maxDoc, IBits acceptDocs, IBits docsWithField)
-                : base(maxDoc, acceptDocs)
-            {
-                this.outerInstance = outerInstance;
-                this.docsWithField = docsWithField;
-            }
-
-            protected internal override sealed bool MatchDoc(int doc)
-            {
-                return !docsWithField.Get(doc);
-            }
-        }
-
-        private class FieldCacheDocIdSetAnonymousInnerClassHelper2 : FieldCacheDocIdSet
-        {
-            private readonly FieldValueFilter outerInstance;
-
-            private readonly IBits docsWithField;
-
-            public FieldCacheDocIdSetAnonymousInnerClassHelper2(FieldValueFilter outerInstance, int maxDoc, IBits acceptDocs, IBits docsWithField)
-                : base(maxDoc, acceptDocs)
-            {
-                this.outerInstance = outerInstance;
-                this.docsWithField = docsWithField;
-            }
-
-            protected internal override sealed bool MatchDoc(int doc)
-            {
-                return docsWithField.Get(doc);
+                return new FieldCacheDocIdSet(context.AtomicReader.MaxDoc, acceptDocs, (doc) => docsWithField.Get(doc));
             }
         }
 
