2016-10-07 15 views
1

私は、フィールド値に基づいて_scoreを上げることによってelasticsearchでソートを取り除こうとしています。ここに私のシナリオです:ElasticSearch:フィールド値に応じてスコアを上げる方法を教えてください。

私は私の文書内のフィールドを持っています:applicationDate。これはEPOCから経過した時間です。私はより大きなapplicationDate(最近)のスコアを持つように記録したい。

2つのドキュメントのスコアが同じ場合、それらをString型の別のフィールドで並べ替える必要があります。 「ステータス」は、値を持つことができる別のフィールドです(使用可能、進行中、閉じています)。したがって、同じapplicationDateを持つドキュメントはステータスに基づいて_scoreを持つ必要があります。 利用可能なスコアは、進捗状況が少なく、閉鎖されている必要があります。ですから、結果を得た後に文書を並べ替える必要はありません。

私にいくつかの指摘をしてください。

答えて

2

Function Scoreを使用してこれを達成できるはずです。 要件に応じて、次のように簡単になります 例:

put test/test/1 
{ 
    "applicationDate" : "2015-12-02", 
    "status" : "available" 
} 
put test/test/2 
{ 
    "applicationDate" : "2015-12-02", 
    "status" : "progress" 
} 

put test/test/3 
{ 
    "applicationDate" : "2016-03-02", 
    "status" : "progress" 
} 


post test/_search 
{ 
    "query": { 
     "function_score": { 
     "functions": [ 
      { 
       "field_value_factor" : { 
        "field" : "applicationDate", 
        "factor" : 0.001 
       } 
      }, 
      { 
       "filter": { 
        "term": { 
        "status": "available" 
        } 
       }, 
       "weight": 360 
      }, 
      { 
       "filter": { 
        "term": { 
        "status": "progress" 
        } 
       }, 
       "weight": 180 
      } 
     ], 
     "boost_mode": "multiply", 
     "score_mode": "sum" 
     } 
    } 
} 
**Results:** 

"hits": [ 
    { 
     "_index": "test", 
     "_type": "test", 
     "_id": "3", 
     "_score": 1456877060, 
     "_source": { 
      "applicationDate": "2016-03-02", 
      "status": "progress" 
     } 
    }, 
    { 
     "_index": "test", 
     "_type": "test", 
     "_id": "1", 
     "_score": 1449014780, 
     "_source": { 
      "applicationDate": "2015-12-02", 
      "status": "available" 
     } 
    }, 
    { 
     "_index": "test", 
     "_type": "test", 
     "_id": "2", 
     "_score": 1449014660, 
     "_source": { 
      "applicationDate": "2015-12-02", 
      "status": "progress" 
     } 
    } 
    ] 
関連する問題