2009-06-28 8 views
5

Estoy trabajando en una funcionalidad de "búsqueda de ciudad más cercana dentro de un radio determinado" con la API de Lucene. los valores de latitud y de larga Am indexación ciudad en Lucene como sigue:Corregir correctamente los valores de latitud y longitud en 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)); 

Desde Lucene sólo entiende cuerdas y no números, Am carnes de los valores de latitud y longitud.

Por ejemplo, si son originales y 41.811846 -87.820628 respectivamente, después de relleno, los valores parecen lat y largo:

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

Estoy haciendo el mismo relleno mientras construyo la consulta de la ciudad más cercana (usando la clase ConstantScoreRangeQuery de Lucene).

Dado que los valores lat y long podrían ser números decimales/negativos, ¿es este el enfoque correcto para indexarlos para obtener las ciudades más cercanas correctas en los resultados de búsqueda cuando lucene realice una operación de Rango/comparación numérica en estos valores?

Gracias.

Respuesta

6

Aquí está la punta de lanza sobre Searching Numerical Fields in Lucene por Uwe Schindler, el experto en el tema. Es posible que necesites usar la anterior (y más lenta) ConstantScoreRangeQuery porque Lucene.net está un poco por detrás de Lucene, y la clase NumericRangeQuery descrita en el enlace todavía no se lanzó en Java Lucene.

1

El artículo vinculado en la respuesta de Yuval F me hizo darme cuenta de que estaba equivocado en un earlier answer, en el que parece estar confiando.

No debe indexar los números negativos tal como están, especialmente en este caso, donde algunos de los valores son negativos y algunos son positivos.

This article parece tener una discusión bastante buena de la búsqueda espacial. Utiliza algunas transformaciones para hacer que todos los valores sean positivos, y también toca otros temas de los que probablemente deberías estar consciente, como los cálculos de distancia.

Una cosa para recordar si está codificando los valores es codificarlos tanto para la indexación como para crear la consulta.

+0

gracias ... ¿y qué hay de los números decimales? – user74042

+0

Gracias de nuevo ... Intenté la solución mencionada en el enlace del artículo anterior (http://sujitpal.blogspot.com/2008/02/spatial-search-with-lucene.html), pero al ejecutar la consulta Lucene.net arroja una excepción: Nombre del parámetro: latitud System.ArgumentException: el valor proporcionado está fuera de los límites. Nombre del parámetro: latitud Aquí está mi consulta: latitud: [131450428 a 132173263] longitud: [091694457 a 092664286] – user74042

Cuestiones relacionadas