2014-10-12 93 views
2

我試圖搜索特定半徑內的結果,並根據距離點(接近第一個,最後一個)的距離對結果進行排序。 但是,返回的結果出現在相反的排序中(遠遠居第一位,接近尾數)。Lucene.Net排序距離點的結果

這裏是我的代碼:

string name = "__Location"; 
var strategy = new PointVectorStrategy(ctx, name); 

var indexSearcher = new IndexSearcher(_dir, true); 

double radious = Double.Parse(rad); 

double lat = 33.8886290; 
double lng = 35.4954790; 

var distance = DistanceUtils.Dist2Degrees(radious, DistanceUtils.EARTH_MEAN_RADIUS_MI); 

var spatialArgs = new SpatialArgs(SpatialOperation.Intersects, ctx.MakeCircle(lng, lat, distance)); 
var spatialQuery = strategy.MakeQuery(spatialArgs); 
Point pt = ctx.MakePoint(lng, lat); 
ValueSource valueSource = strategy.MakeDistanceValueSource(pt); 


ValueSourceFilter vsf = new ValueSourceFilter(new QueryWrapperFilter(spatialQuery), valueSource, 0, distance); 
var filteredSpatial = new FilteredQuery(new MatchAllDocsQuery(), vsf); 
var spatialRankingQuery = new FunctionQuery(valueSource); 
BooleanQuery bq = new BooleanQuery(); 
bq.Add(filteredSpatial,Occur.MUST); 
bq.Add(spatialRankingQuery,Occur.MUST); 

TopDocs hits = indexSearcher.Search(bq, 10); 

我怎樣才能從最近到遠處的結果進行排序?

我使用:

  • Lucene.Net 3.0.3

  • Lucene.Net.Contrib.Spatial 3.0.3

  • Spatial4n.Core 0.3

謝謝

回答

1

這似乎是在Lucene.Net.Contrib.Spatial在MakeDistanceValueSource方法的錯誤,所以我寫邁上了一個新DistanceValueSource類,它可以解決這個問題,叫DistanceReverseValueSource,你可以找到源類:

https://gist.github.com/aokour/088cd6484bce5e95ba83

這是我現在更新程式碼:

string name = "__Location"; 
var strategy = new PointVectorStrategy(ctx, name); 

var indexSearcher = new IndexSearcher(_dir, true); 

double radious = Double.Parse(rad); 

double lat = 33.8886290; 
double lng = 35.4954790; 

var distance = DistanceUtils.Dist2Degrees(radious, DistanceUtils.EARTH_MEAN_RADIUS_MI); 

var spatialArgs = new SpatialArgs(SpatialOperation.Intersects, ctx.MakeCircle(lng, lat, distance)); 
var spatialQuery = strategy.MakeQuery(spatialArgs); 
Point pt = ctx.MakePoint(lng, lat); 
DistanceReverseValueSource valueSource = new DistanceReverseValueSource(strategy, pt, distance); 


ValueSourceFilter vsf = new ValueSourceFilter(new QueryWrapperFilter(spatialQuery), valueSource, 0, distance); 
var filteredSpatial = new FilteredQuery(new MatchAllDocsQuery(), vsf); 
var spatialRankingQuery = new FunctionQuery(valueSource); 
BooleanQuery bq = new BooleanQuery(); 
bq.Add(filteredSpatial,Occur.MUST); 
bq.Add(spatialRankingQuery,Occur.MUST); 

TopDocs hits = indexSearcher.Search(bq, 10); 

現在的結果是從最接近的排序,以farest!