Beim Versuch, datetime (long) numerische Felder zu sortieren, erhalte ich immer eine FormatException.Lucene - Sortierdatum als NumericField
When converting a string to DateTime, parse the string to take the date before putting each variable into the DateTime object.
Hinzufügen des Zahlenfeld:
doc.Add(new NumericField("creationDate", Field.Store.YES, true)
.SetLongValue(DateTime.UtcNow.Ticks);
Add Sortierung:
// 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
den Index Inspizieren, kann ich überprüfen, ob 'creation' Feld "long" Werte speichert. Was könnte diese Ausnahme verursachen?
EDIT:
Abfrage
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;
Version: Lucene.Net 3.0.3
UPDATE:
Dieses Problem wieder auftritt, nun mit INT-Werten. Ich habe Lucene.Net-Quellcode heruntergeladen und das Problem behoben.
Es ist irgendwo im FieldCache, wenn Sie versuchen, den Wert "\ \ \ \ \ \ \" zu Integer zu analysieren, was ein bisschen seltsam erscheint.
Ich füge diese Werte als numerische Felder:
doc.Add(new NumericField(VersionNum, int.MaxValue, Field.Store.YES,
true).SetIntValue(VersionValue));
Ich bekomme die Ausnahme, wenn ich soll mindestens 1 Hit zurück zu bekommen. Nach dem Index Inspektion ich sehe, dass der Begriff des Feldes, wie folgend:
Und das Feld Text:
EDIT:
Ich habe ein fest einprogrammiert int-Wert und fügte einige Segmente hinzu:
doc.Add(new Field(VersionNum, NumericUtils.IntToPrefixCoded(1), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
Welche führte das Versionsfeld wie auf der Speicherung:
Und noch, wenn ich versuche ich die Parsing-Fehler erhalten zu sortieren:
var sortVersion = new SortField(VersionNum, SortField.INT, true);
Für jede Ausnahme, Lucene versucht "zu analysieren \ b \ 0 \ 0 \ 0 ". Betrachtet man den vorangestellten Code als String gespeichert, würde 1 in "\ b \ 0 \ 0 \ 0 \ 1" übersetzt werden.
Wird Lucene im FieldCache wahrscheinlich etwas Müll hinterlassen?
können Sie zeigen, wie "Abfrage" erstellt wird? – AndyPook
@AndyPook Nur die Frage bearbeitet und die "Abfrage" hinzugefügt. Es funktioniert gut, wenn ich nach DOC sortiere. –
Das Datumsfeld ist nicht in der Abfrage enthalten, es wird nur zum Sortieren verwendet. Nehmen wir an, dass ich nur nach einer benutzerdefinierten Feld-ID frage, die gewährt wird, um eine Reihe von Ergebnissen zurückzugeben. –