2009-06-28 5 views
5

Ich arbeite an einer "US-basierten Suche in der Stadt in einem bestimmten Umkreis" mit Lucene API. Am Indizierungs Stadt lat und lange Werte in Lucene wie folgt:Korrekte Indizierung von Breiten- und Längenwerten in Lucene

doc.Add(new Field("latitude", paddedLatitude, Field.Store.YES, Field.Index.UN_TOKENIZED)); 

doc.Add(new Field("longitude", paddedLongitude, Field.Store.YES, Field.Index.UN_TOKENIZED)); 

Da Lucene nur Strings und nicht die Zahlen versteht, sind Klotzen lat und lange Werte.

Wenn beispielsweise Original lat und lange 41,811846 und -87,820628 jeweils nach Polsterung, Werte wie folgt aussehen:

paddedLatitude -> "0.041,811846" und paddedLongitude -> "- 087,820628"

Mache die gleiche Auffüllung, während ich die nächste Stadtabfrage (mit der ConstantScoreRangeQuery-Klasse von Lucene) erstelle.

Angesichts der Tatsache, dass Lat und Long-Werte Dezimal/negative Zahlen sein können, ist dies der richtige Ansatz, sie zu indizieren, so dass ich die nächstgelegenen Städte in den Suchergebnissen erhalten würde, wenn Lucene eine Nummer Range/Vergleich durchführen würde diese Werte?

Danke.

Antwort

6

Hier ist die blitzende Kante über Searching Numerical Fields in Lucene von Uwe Schindler, der Experte auf dem Thema. Möglicherweise müssen Sie die ältere (und langsamere) ConstantScoreRangeQuery verwenden, da Lucene.net ein wenig hinter Lucene liegt und die in der Verknüpfung beschriebene Klasse NumericRangeQuery in Java Lucene noch nicht veröffentlicht wurde.

1

Der verknüpfte Artikel in Yuval Fs Antwort ließ mich erkennen, dass ich mich in einem earlier answer, auf den Sie sich zu verlassen scheinen, irrte.

Sie sollten negative Zahlen nicht so indizieren, wie in diesem Fall, wo einige der Werte negativ und einige positiv sind.

This article scheint eine ziemlich gute Diskussion der räumlichen Suche zu haben. Er verwendet einige Transformationen, um alle Werte positiv zu machen, und er berührt auch andere Themen, die Sie wahrscheinlich kennen sollten, wie zum Beispiel Entfernungsberechnungen.

Eine Sache, die Sie beachten sollten, wenn Sie die Werte codieren, besteht darin, sie sowohl für die Indizierung als auch für die Erstellung der Abfrage zu codieren.

+0

danke ... und was ist mit Dezimalzahlen? – user74042

+0

Nochmals vielen Dank .... Ich habe versucht, Lösung erwähnt in oben Artikel Link (http://sujitpal.blogspot.com/2008/02/spatial-search-with-lucene.html), aber bei der Ausführung der Abfrage Lucene.net wirft Eine Ausnahme: Parametername: latitude System.ArgumentException: Der angegebene Wert liegt außerhalb des zulässigen Bereichs. Parametername: latitude Hier ist meine Frage: geographische Breite: [131450428 TO 132173263] Länge: [091694457 TO 092664286] – user74042