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 могат да бъдат отрицателни стойности. Как правилно да съхранявам десетични числа със знак в 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);

Освен това исках да знам как ConstantScoreRangeQuery на Lucene е по-добър от класа RangeQuery.

Изправен съм пред друг проблем в този контекст: имам един от документите в индекса със следните 3 града:

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

    Оук Брук, Илинойс

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

Ако дам въвеждане като "Lyons, IL", тогава този запис се появява. Но ако дам Сан Франциско, Калифорния като вход, тогава не става.

Ако обаче съхраня градовете за този документ, както следва:

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

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

    Оук Брук, Илинойс

    и когато дам Сан Франциско, Калифорния като вход, тогава този запис се показва в резултатите от търсенето.

Това, което искам тук е, че ако напиша някой от 3-те града във входа, трябва да получа този документ в резултатите от търсенето.

Моля, помогнете ми да постигна това.

Благодаря.


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)


Следвайки предложението на skaffman, можете да използвате същата координатна система за плочки използван от всички популярни приложения за карти. Изберете каквото и ниво на мащабиране да е достатъчно детайлно за вашите нужди и не забравяйте да добавите водещи нули.

Относно RangeQuery, това е по-бавен от ConstantScoreRangeQuery и ограничава диапазона от стойности.

По отношение на проблема град-държава можем само да спекулираме. Но първите неща, които трябва да проверите, са дали индексираните термини и анализираната заявка са това, което очаквате да бъдат.

person A. Coady    schedule 27.06.2009

Мисля, че най-добрият начин е да конвертирате/нормализирате координатите, както е предложено в предишния пост. Тази статия прави точно това. Това всъщност е доста хубав обектно-ориентиран код.

Относно втория ви проблем. Предполагам, че имате някакъв проблем с анализатора. Използвате ли същия анализатор за индексиране и заявки? Кои токенизатори използвате?

Препоръчвам да използвате Luke, за да проверите генерирания от вас индекс, за да видите кои токени всъщност могат да се търсят.

--Харди

person Hardy    schedule 01.07.2009

Една от възможностите тук е да конвертирате координатите в система, която няма отрицателни числа. Например, имах подобен проблем за уеб приложение на Google Maps за Обединеното кралство и съхраних полета UK Easting/Northings (които варират от 0 до 7 цифри) в Lucene заедно със стойностите за ширина/дължина. Като форматирам тези eastings/northings с ляво подплатени нули, бих могъл да направя заявки за обхват на lucene.

Има ли подобна координатна система за САЩ?

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