2016-03-30 11 views
1

地理空間データを格納するために弾性検索を使用しようとしています。しかし、私は、関連性スコアがポイントからの距離とテキストマッチングクエリに基づく関連性の組み合わせであることを望んでいます。たとえば、クエリがYellowstone National Parkですが、発信元はシカゴにあるとします。 Yellowstone National Parkは減衰スコアが0に近く、結果にまったく表示されないため、合理的な距離と減衰のために、シカゴのPortage Parkが一致する可能性が高くなります。私がしたいのは、一定の距離を越えてすべての結果が同じに見えるように、減衰スコアにフロアを設けることです。私がやりたいのは何ElasticSearchで床をガウス減衰関数に設定するにはどうすればよいですか?

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

は同じように、原点から30キロを言うよりも大きくない、と何の減衰関数を持っているすべてのポイントを扱うです:

は例えば、ここで私が持っているJavaコードですそのポイントを超えてスコアを減らしてください。これは可能ですか?問題は、特定の距離を超えて減衰関数が関連性を大幅に減少させ、クエリがテキストフィールドと完全に一致しても結果には表示されないということです。

答えて

1

私はElasticsearchのfunction scoreで実装されている機能についてはわかりませんが、非常に便利です。

しかし、あなたは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キロの範囲内のヒットにガウス関数のスコアを適用します。 2番目のフィルタ節では、すべてのヒットの定数スコアを定義します。これはさらに遠いです。 同じ要素を複数回スコアリングしないように、include_upperとinclude_lowerを適切に設定する必要があることに注意してください。

関連する問題