2012-12-05 17 views
0

根據與正在搜索的文檔連接的字段的大小,可以動態計算最大距離dist的查詢。Lucene 4.0空間計算最大。動態計算距離(使用索引文檔的字段)

我的意思是這樣的:

ctx.makeCircle(la, lo, DistanceUtils.dist2Degrees(Min(100km, currentDocumnet.getField("max_distance")),DistanceUtils.EARTH_MEAN_RADIUS_KM)) 

相反的:

new SpatialArgs(SpatialOperation.Intersects,ctx.makeCircle(la, lo, DistanceUtils.dist2Degrees(dist,DistanceUtils.EARTH_MEAN_RADIUS_KM))); 

爲了得到我想要的,我做我的ScoreDoc一些手動過濾結果:

   String maxDistance = d.get(Offer.MAX_DISTANCE); 
       if (maxDistance != null && maxDistance.length() > 0) { 
        logger.info("Contractor max. distance =" + maxDistance); 
        int maxContractorDistance = Integer 
          .parseInt(maxDistance); 

        if (distKM > maxContractorDistance 
          && maxContractorDistance > 0) { 
         logger.info("Contractor is too far" 
           + maxContractorDistance); 
         continue; 
        } 

       } 
+2

看來你實際上是要求索引圓(點+半徑),然後讓你的查詢匹配;對? –

+0

不完全。當我指數圈而不是點時,我會獲得更多的結果。當圈子重疊時,我不希望匹配。當這個圓圈的每一個重疊時,我只想要結果。 – Damian

回答

0

啊;有趣。您應該使用兩個空間過濾器一起實現此過程。其中之一,基於索引距離要求的過濾器,以及基於查詢索引要求的其他過濾器。

第一個空間字段應該是RecursivePrefixTreeStrategy,這是您應該爲圓形狀編制索引的位置。在爲該字段進行查詢/篩選時,查詢形狀是一個點。第二個空間字段也應該使用RecursivePrefixTreeStrategy,但是您應該單獨爲這些圓圈的中心點編制索引。您的查詢形狀是第二個字段的圓圈。這兩個查詢/過濾器都會比您想要的更匹配,但如果您將它們組合起來以使匹配的文檔必須同時滿足這兩個要求,您將獲得正確的文檔集。