.net – SpatialQuery for location based search using Lucene

lucenelucene.net

My lucene index has got latitude and longitudes fields indexed as follows:

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));

I want to retrieve a set of documents from this index whose lat and long values are in a given range.

As you already know, Lat and long could be negative values. How do i correctly store signed decimal numbers in Lucene?
Would the approach mentioned below give correct results or is there any other way to do this?

 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);

Also,I wanted to know how Lucene's ConstantScoreRangeQuery is better than RangeQuery class.

Am facing another problem in this context:
I've one of the documents in the index with the following 3 cities:

  • Lyons, IL

    Oak Brook, IL

    San Francisco, CA

If i give input as "Lyons, IL" then this record comes up.
But if i give San Francisco, CA as input, then it does not.

However, if i store the cities for this document as follows:

  • San Francisco, CA

    Lyons, IL

    Oak Brook, IL

    and when i give San Francisco, CA as input, then this record shows in the search results.

What i want here is that if i type any of the 3 cities in input,I should get this document in the search results.

Please help me achieve this.

Thanks.

Best Answer

Following up on skaffman's suggestion, you can use the same tile coordinate system used by all the popular map apps. Choose whatever zoom level is granular enough for your needs, and don't forget to pad with leading zeros.

Regarding RangeQuery, it's slower than ConstantScoreRangeQuery and limits the range of values.

Regarding the city-state problem, we can only speculate. But the first things to check are that the indexed terms and the parsed query are what you expect them to be.

Related Topic