Корректное индексирование значений широты и долготы в Lucene - PullRequest
5 голосов
/ 28 июня 2009

Я работаю над "поиском ближайшего города в США в пределах заданного радиуса", используя Lucene API. Индексирую значения широты и долготы города в 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));

Поскольку Lucene понимает только строки, а не числа, я добавляю значения lat и long.

Например, если исходные значения lat и long равны 41.811846 и -87.820628, соответственно, после заполнения значения выглядят следующим образом:

paddedLatitude -> "0041.811846" и paddedLongitude -> "- 087.820628"

Я делаю то же самое при заполнении запроса ближайшего города (используя класс Lucene ConstantScoreRangeQuery).

Учитывая тот факт, что значения lat и long могут быть десятичными / отрицательными числами, является ли это правильным подходом для индексации их, чтобы я мог получить правильные ближайшие города в результатах поиска, когда lucene будет выполнять операцию Range / сравнения чисел с этими значения?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 28 июня 2009

Вот передовой край Поиск числовых полей в Lucene Уве Шиндлер, эксперт по этому вопросу. Возможно, вам придется использовать более старый (и более медленный) метод ConstantScoreRangeQuery, поскольку Lucene.net немного отстает от Lucene, а класс NumericRangeQuery, описанный в ссылке, еще не был выпущен в Java Lucene.

1 голос
/ 29 июня 2009

Связанная статья в ответе Ювала Ф. заставила меня понять, что я ошибался в более раннем ответе , на который вы, похоже, полагаетесь.

Не следует индексировать отрицательные числа как есть, особенно в этом случае, когда некоторые значения являются отрицательными, а некоторые - положительными.

Эта статья , похоже, довольно неплохо обсуждает пространственный поиск. Он использует некоторые преобразования, чтобы сделать все значения положительными, а также затрагивает другие темы, которые вы, вероятно, должны знать, например, расчеты расстояния.

Следует помнить одну вещь, если вы кодируете значения, это кодировать их как для индексации, так и при построении запроса.

...