2016-03-30 37 views
1

我正在嘗試使用彈性搜索來存儲地理空間數據。不過,我希望相關性分數是來自某個點的距離和基於文本匹配查詢的相關性的組合。例如,假設查詢是Yellowstone National Park,但原點在芝加哥。在芝加哥的Portage Park更可能匹配,因爲任何合理的距離和衰減,因爲Yellowstone National Park將衰減分數接近於零,並且不會顯示在結果中。我想要做的就是在衰減分數上有一個FLOOR,這樣超出一定的距離後,所有的結果看起來都是一樣的。如何設置ElasticSearch中的高斯衰減函數?

例如,這裏的Java代碼,我有:

 queryBuilder = new FunctionScoreQueryBuilder(queryBuilder).add(
     ScoreFunctionBuilders.gaussDecayFunction("search_geo_point", point.get(), "10km") 
      .setDecay(0.75) 
      .setOffset("5km")); 

我希望做的是把那些大於說30公里從起源相同,並具有衰減功能沒有的所有點更長的時間將分數降低到超過該點。這可能嗎?問題在於,超過一定的距離衰減函數會大大降低相關性,即使查詢與文本字段完全匹配,它也不會出現在結果中。

回答

1

我不知道在Elasticsearch函數分數內實現的一個特性,雖然它會非常方便。

但是,您可以通過在function query使用過濾子句達到一個小的解決方法你的目標:

POST test/parks/_search 
{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match": { 
      "name": "Yellowstone National park" 
     } 
     }, 
     "functions": [ 
     { 
      "gauss": { 
      "location": { 
       "origin": "41.4881832, -87.623177", 
       "scale": "10km", 
       "offset": "5km" 
      } 
      }, 
      "filter": { 
      "geo_distance_range": { 
       "from": "0km", 
       "to": "30km", 
       "location": { 
       "lat": 41.881832, 
       "lon": -87.623177 
       }, 
       "include_upper": false 
      } 
      } 
     }, 
     { 
      "weight": ## Set appropriate weight, 
      "filter": { 
      "geo_distance_range": { 
       "from": "30km", 
       "location": { 
       "lat": 41.881832, 
       "lon": -87.623177 
       }, 
       "include_lower": true 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

通過上面的查詢,你只有30公里範圍內的高斯函數比分適用於點擊。在第二個過濾條款中,您爲所有點擊定義了一個常數分數,這些分數在遠處更遠。 請注意,您應該適當地設置include_upper和include_lower以防止多次對相同元素打分。