NumericField は、トライ構造を使用してインデックス付けされます。表示される用語はその一部ですが、クエリを実行しても結果は返されません。
NumericField のインデックスを Int32.MaxValue の精度ステップで試してみると、値がなくなります。
数値フィールドのドキュメント
... Lucene 内では、各数値はトライ構造としてインデックス付けされ、各用語は、より大きな事前定義された大括弧 (単純に値の低精度表現) に論理的に割り当てられます。連続するブラケット間のステップ サイズは、precisionStep と呼ばれ、ビット単位で測定されます。precisionStep の値を小さくすると、括弧の数が多くなり、インデックスでより多くのディスク領域を消費しますが、範囲検索のパフォーマンスが向上する可能性があります。デフォルト値の 4 は、ディスク容量の消費とパフォーマンスの合理的なトレードオフのために選択されました。値を変更したい場合は、エキスパート コンストラクタ NumericField(String,int,Field.Store,boolean) を使用できます。NumericRangeQuery または NumericRangeFilter を作成するときは、合同値も指定する必要があることに注意してください。カーディナリティの低いフィールドの場合、より大きな精度のステップが適しています。カーディナリティが 100 未満の場合は、値ごとに 1 つの項を生成する Integer.MAX_VALUE を使用するのが適切です。...
NumericRangeQuery ドキュメントで利用可能な精度ステップの詳細:
precisionStep の適切な値は、使用法とデータ型によって異なります。
• すべてのデータ型のデフォルトは 4 で、precisionStep が指定されていない場合に使用されます。
• ほとんどの場合、64 ビット データ型 (long、double) の理想値は 6 または 8 です。
• ほとんどの場合、32 ビット データ型 (int、float) の理想値は 4 です。
• カーディナリティの低いフィールドの場合は、より大きな精度ステップが適しています。カーディナリティが 100 未満の場合は、•Integer.MAX_VALUE を使用するのが適切です (以下を参照)。
• long/double のステップが 64 以上、int/float のステップが 32 以上の場合、インデックス内の値ごとに 1 つのトークンが生成され、クエリは従来の TermRangeQuery と同じくらい遅くなります。ただし、並べ替えのみに使用されるフィールドを生成するために使用できます (この場合は、単純に Integer.MAX_VALUE を precisionStep として使用します)。フィールド キャッシュの構築は、テキストのみの数値よりもはるかに高速であるため、並べ替えに NumericFields を使用するのが理想的です。これらのフィールドには、値ごとに 1 つの用語があるため、個別のリストを作成するための用語の列挙にも使用できます (たとえば、ファセット / 検索する事前に選択された値)。上記の precisionSteps のいずれかを使用して、範囲クエリ最適化フィールドで並べ替えも可能です。
編集
少しのサンプルですが、これによって生成されたインデックスは、ルークで値が 8192、9984、1792 などの用語を表示しますが、クエリにそれらを含む範囲を使用すると、結果が生成されません。
NumericField number = new NumericField("number", Field.Store.YES, true);
Field regular = new Field("normal", "", Field.Store.YES, Field.Index.ANALYZED);
IndexWriter iw = new IndexWriter(FSDirectory.GetDirectory("C:\\temp\\testnum"), new StandardAnalyzer(), true);
Document doc = new Document();
doc.Add(number);
doc.Add(regular);
number.SetIntValue(1);
regular.SetValue("one");
iw.AddDocument(doc);
number.SetIntValue(2);
regular.SetValue("one");
iw.AddDocument(doc);
number.SetIntValue(13);
regular.SetValue("one");
iw.AddDocument(doc);
number.SetIntValue(2000);
regular.SetValue("one");
iw.AddDocument(doc);
number.SetIntValue(9999);
regular.SetValue("one");
iw.AddDocument(doc);
iw.Commit();
IndexSearcher searcher = new IndexSearcher(iw.GetReader());
NumericRangeQuery rangeQ = NumericRangeQuery.NewIntRange("number", 1, 2, true, true);
var docs = searcher.Search(rangeQ);
Console.WriteLine(docs.Length().ToString()); // prints 2
rangeQ = NumericRangeQuery.NewIntRange("number", 13, 13, true, true);
docs = searcher.Search(rangeQ);
Console.WriteLine(docs.Length().ToString()); // prints 1
rangeQ = NumericRangeQuery.NewIntRange("number", 9000, 9998, true, true);
docs = searcher.Search(rangeQ);
Console.WriteLine(docs.Length().ToString()); // prints 0
Console.ReadLine();