2016-10-07 2 views
1

Ich versuche, die Sortierung in elasticsearch loszuwerden, indem ich die _Score basierend auf Feldwert erhöht. Hier ist mein Szenario:ElasticSearch: Wie kann ich die Punktzahl je nach Feldwert erhöhen?

Ich habe ein Feld in meinem Dokument: applicationDate. Dies ist die seit EPOC verstrichene Zeit. Ich möchte Rekord mit mehr ApplicationDate (neueste), um höhere Punktzahl zu haben.

Wenn der Wert von zwei Dokumenten gleich ist, möchte ich sie nach einem anderen Feld vom Typ String sortieren. Sagen Sie "Status" ist ein anderes Feld, das Wert haben kann (Verfügbar, in Bearbeitung, geschlossen). Daher sollten Dokumente mit demselben applicationDate basierend auf dem Status _score haben. Verfügbar sollte mehr Punktzahl haben, In Bearbeitung weniger, Geschlossen, am wenigsten. Auf diese Weise muss ich die Dokumente nicht nach den Ergebnissen sortieren.

Bitte geben Sie mir einige Hinweise.

Antwort

2

Sie sollten dies mit Function Score erreichen können. Abhängig von Ihren Anforderungen könnte es so einfach sein wie die folgenden Beispiel:

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" 
     } 
    } 
    ] 
Verwandte Themen