2012-12-13 24 views
5

Herhangi bir kimse, lucene.net endeksi ve boylam değerlerine sahip olmaktan çıkıp, tek bir noktadan uzaklığa göre sıralı bir sonuç kümesi döndürüyor mu?Lucene.net yakınlık araması

Lucene.Net.Spatial kütüphanesi bu konuda bana yardımcı olur mu?

+1

İyi bir soruyla karşılaşabilirsiniz. Ben de bilmek isterim. –

cevap

4

Partiye biraz geç ama evet, Mekansal kütüphane bununla başlayacak yer. Arkasında temelleri şunlardır:

1) belgenin

doc.Add(new Field("Latitude", 
        NumericUtils.DoubleToPrefixCoded(Latitude), 
        Field.Store.YES, Field.Index.NOT_ANALYZED)); 

doc.Add(new Field("Longitude", 
        NumericUtils.DoubleToPrefixCoded(Longitude), 
        Field.Store.YES, Field.Index.NOT_ANALYZED)); 

2) Arama desteklemesi gerekir ayrıntı her bir grup için darbecileri oluşturma Lat ve Uzun alanlar ekleme

IProjector projector = new SinusoidalProjector(); 
var ctp = new CartesianTierPlotter(0, projector, 
            Fields.LocationTierPrefix); 
StartTier = ctp.BestFit(MaxKms); 
EndTier = ctp.BestFit(MinKms); 

Plotters = new Dictionary<int, CartesianTierPlotter>(); 
for (var tier = StartTier; tier <= EndTier; tier++) 
{ 
    Plotters.Add(tier, new CartesianTierPlotter(tier, 
              projector, 
              Fields.LocationTierPrefix)); 
} 

3) ile her bir grup için endekse

private static void AddCartesianTiers(double latitude, 
             double longitude, 
             Document document) 
{ 
    for (var tier = StartTier; tier <= EndTier; tier++) 
    { 
     var ctp = Plotters[tier]; 
     var boxId = ctp.GetTierBoxId(latitude, longitude); 
     document.Add(new Field(ctp.GetTierFieldName(), 
         NumericUtils.DoubleToPrefixCoded(boxId), 
         Field.Store.YES, 
         Field.Index.NOT_ANALYZED_NO_NORMS)); 
    } 
} 

belgenizi sizin darbecileri Lütfen kullanın indeksli bir sorguyu oluşturmaya devam edebilirsiniz. Bu örnek, bir ConstantScoreQuery kullanır ancak değişmekteydi puanlama için bu takas olabilir:

/* Builder allows us to build a polygon which we will use to limit 
* search scope on our cartesian tiers, this is like putting a grid 
* over a map */ 
var builder = new CartesianPolyFilterBuilder(Fields.LocationTierPrefix); 

/* Bounding area draws the polygon, this can be thought of as working 
* out which squares of the grid over a map to search */ 
var boundingArea = builder.GetBoundingArea(Latitude, 
       Longitude, 
       DistanceInKilometres * ProductSearchEngine.KmsToMiles); 

/* We refine, this is the equivalent of drawing a circle on the map, 
* within our grid squares, ignoring the parts the squares we are 
* searching that aren't within the circle - ignoring extraneous corners 
* and such */ 
var distFilter = new LatLongDistanceFilter(boundingArea, 
            DistanceInKilometres * KmsToMiles, 
            Latitude, 
            Longitude, 
            ProductSearchEngine.Fields.Latitude, 
            ProductSearchEngine.Fields.Longitude); 

/* We add a query stating we will only search against products that have 
* GeoCode information */ 
var query = new TermQuery(new Term(Fields.HasGeoCode, 
            FieldFlags.HasField)); 

/* Add our filter, this will stream through our results and 
* determine eligibility */ 
masterQuery.Add(new ConstantScoreQuery(distanceFilter), 
       BooleanClause.Occur.MUST); 

Tüm bu

Sadece benzer bir sorun bakıyor iken yazdığı bir blog yayınında alınır. http://www.leapinggorilla.com/Blog/Read/1005/spatial-search-in-lucenenet

+0

Mükemmel örnek için teşekkürler. SınırlamaArea bölümü ile ilgili bir sorunum var ... sadece bir diğerine yakın olan, ancak istediğim koordinatlardan uzaktaki belgeleri sunan bir sorun var, bu yüzden LatLongDistanceFilter onları kontrol ediyor ve " Çok uzakta, sonuç alınamadı. – Jarvis

+1

Blogumuza başka bir çalışmış örnek ekledim (http://leapinggorilla.com/Blog/Read/1010/spatial-search-in-lucenenet---worked-example). Bu bir demo uygulaması işleyişini görmeniz için gereken tüm kodlara sahiptir, bu yüzden umarım yardımcı olmalısınız. – Wolfwyrd