2014-10-12 6 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); 

어떻게 근처에서 먼 거리에 결과를 정렬 할 수 있습니다 : 여기

내 코드?

내가 사용하고 있습니다 : 3.0.3

  • Lucene.Net.Contrib.Spatial

    • Lucene.Net 3.0.3

    • Spatial4n.Core 0.3

    감사합니다.

  • 답변

    1

    이것은 MakeDistanceValueSource 방법 Lucene.Net.Contrib.Spatial 버그 것 같다, 그래서 난 당신이 클래스의 소스를 찾을 수 있습니다,이 문제를 해결할 수 있습니다 aa는 새로운 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하는가!