SpatialQuery для поиска на основе местоположения с использованием Lucene

В моем индексе lucene поля широты и долготы проиндексированы следующим образом:

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

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

Я хочу получить набор документов из этого индекса, значения lat и long которых находятся в заданном диапазоне.

Как вы уже знаете, Lat и long могут быть отрицательными значениями. Как правильно хранить десятичные числа со знаком в Lucene? Дает ли упомянутый ниже подход правильные результаты или есть другой способ сделать это?

 Term lowerLatitude = new Term("latitude", bounds.South.ToString() );
                Term upperLatitude = new Term("latitude", bounds.North.ToString());
                RangeQuery latitudeRangeQuery = new RangeQuery(lowerLatitude, upperLatitude, true);
                findLocationQuery.Add(latitudeRangeQuery, BooleanClause.Occur.SHOULD);



                Term lowerLongitude = new Term("longitude", bounds.West.ToString());
                Term upperLongitude = new Term("longitude", bounds.East.ToString());
                RangeQuery longitudeRangeQuery = new RangeQuery(lowerLongitude, upperLongitude, true);
                findLocationQuery.Add(longitudeRangeQuery, BooleanClause.Occur.SHOULD);

Кроме того, я хотел узнать, чем Lucene ConstantScoreRangeQuery лучше, чем класс RangeQuery.

В этом контексте я столкнулся с другой проблемой: у меня есть один из документов в индексе со следующими тремя городами:

  • Лион, Иллинойс

    Дуб Брук, штат Иллинойс

    Сан-Франциско, Калифорния

Если я введу «Лион, Иллинойс», то появится эта запись. Но если я введу Сан-Франциско, Калифорния, то это не так.

Однако, если я сохраню города для этого документа следующим образом:

  • Сан-Франциско, Калифорния

    Лион, Иллинойс

    Дуб Брук, штат Иллинойс

    и когда я вводю Сан-Франциско, Калифорния, эта запись отображается в результатах поиска.

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

Пожалуйста, помогите мне добиться этого.

Спасибо.


person user74042    schedule 27.06.2009    source источник
comment
Это действительно 3 отдельных вопроса. Почему бы тебе не разделить это?   -  person itsadok    schedule 28.06.2009
comment
Здесь. Я сделал за вас первый шаг: stackoverflow.com/questions/1054719   -  person itsadok    schedule 28.06.2009


Ответы (3)


Следуя предложению Скаффмана, вы можете использовать ту же систему координат плитки используется всеми популярными картографическими приложениями. Выберите любой уровень масштабирования, достаточно точный для ваших нужд, и не забудьте заполнить его ведущими нулями.

Что касается RangeQuery, это медленнее, чем ConstantScoreRangeQuery, и ограничивает диапазон значений.

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

person A. Coady    schedule 27.06.2009

Я думаю, что лучший способ - преобразовать / нормализовать координаты, как было предложено в предыдущем посте. Эта статья делает именно это. На самом деле это довольно хороший объектно-ориентированный код.

По поводу вашей второй проблемы. Я предполагаю, что у вас какая-то проблема с анализатором. Вы используете один и тот же анализатор для индексации и запросов? Какие токенизаторы вы используете?

Я рекомендую использовать Luke для проверки созданного вами индекса, чтобы увидеть, какие токены действительно доступны для поиска.

- Hardy

person Hardy    schedule 01.07.2009

Один из вариантов - преобразовать координаты в систему, не имеющую отрицательных чисел. Например, у меня была аналогичная проблема для веб-приложения Google Maps для Великобритании, и я сохранил поля UK Easting / Northings (которые варьируются от 0 до 7 цифр) в Lucene вместе со значениями lat / long. Отформатировав эти восточные / северные координаты с заполненными слева нулями, я мог выполнять запросы диапазона lucene.

Есть ли аналогичная система координат для США?

person skaffman    schedule 27.06.2009
comment
спасибо .. я изучу этот вариант ... не могли бы вы ответить на вторую часть моего вопроса о нескольких городах? - person user74042; 28.06.2009