日時(長い)数値フィールドをソートしようとすると、私は常にFormatExceptionを取得します。Lucene - 日付をNumericFieldとしてソート
doc.Add(new NumericField("creationDate", Field.Store.YES, true)
.SetLongValue(DateTime.UtcNow.Ticks);
が仕分け追加:数値フィールドの追加
インデックスを検査When converting a string to DateTime, parse the string to take the date before putting each variable into the DateTime object.
// boolean query
var sortField = new SortField("creationDate", SortField.LONG, true);
var inverseSort = new Sort(sortField);
var results = searcher.Search(query, null, 100, inverseSort); // exception thrown here
を、私は 'のCreationDate' フィールドは、 "長い" の値を格納していることを確認することができます。この例外の原因は何ですか?
EDIT:
クエリ
var query = new BooleanQuery();
foreach (var termQuery in incomingProps.Select(p => new TermQuery(new Term(kvp.Key, kvp.Value.ToLowerInvariant()))
{
query.Add(new BooleanClause(termQuery , Occur.Must));
}
return query;
バージョン:3.0.3 Lucene.Net
UPDATE:
この問題は、今INT値で、再び発生しています。 Lucene.Netのソースコードをダウンロードし、問題をデバッグしました。
値 "\ b \ 0 \ 0 \ 0"を整数に解析しようとするとFieldCacheのどこかにありますが、少し奇妙です。
私は数値フィールドとして、これらの値を追加している:
doc.Add(new NumericField(VersionNum, int.MaxValue, Field.Store.YES,
true).SetIntValue(VersionValue));
私は、少なくとも1が戻って打撃を受けることになってるときに私は例外を取得。
とフィールドのテキストは次のとおりです: はインデックスを検査した後、私は次のようにフィールドの用語があることがわかり
EDIT:
私はハードコードしましたint値に変更し、いくつかのセグメントを追加しました:
doc.Add(new Field(VersionNum, NumericUtils.IntToPrefixCoded(1), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
そして私は、私はパースエラーを取得並べ替えしようとすると、まだ、:としてバージョンフィールドを格納になった
すべての例外については
var sortVersion = new SortField(VersionNum, SortField.INT, true);
を、Luceneのは「解析しようとしている\ b \ 0 \ 0 \ 0 "である。 文字列として格納された接頭語コードを見ると、1は "\ b \ 0 \ 0 \ 0 \ 1"に変換されます。
LuceneはおそらくFieldCacheにいくらかのゴミを残していますか?
"クエリ"の作成方法を表示できますか? – AndyPook
@AndyPook質問を編集して「クエリ」を追加しました。私がDOCでソートすれば正常に動作します。 –
日付フィールドはクエリには含まれていません。ソートにのみ使用されます。結果セットを返すように与えられたカスタムフィールドIDだけをクエリするとします。 –