2017-02-01 1 views
0

Ich bin neu bei Elasticsearch. Eigentlich habe ich heute angefangen.Erhalte nur das Dokument mit der maximalen Punktzahl. Elasticsearch

Ich habe das "Bank" -Beispiel, das sie haben, und habe das gleiche Konto zweimal hinzugefügt.

Dann wollte ich sehen, ob ich das Konto mit dieser Nummer bekommen konnte, und es kam drei Konten mit der gleichen Nummer. Das ist ok.

Aber dann schrieb ich meine eigene "score interpretation" und sah, dass es funktioniert.

Und jetzt möchte ich nur das Dokument (Konto) mit der größten Punktzahl, aber ich weiß nicht, wie es geht.

Dies ist, was ich als JSON schrieb:

{ 
    "query": { 
     "function_score": { 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "match": { 
           "account_number": "998"             } 
         } 
        ] 
       } 
      }, 
      "functions": [ 
       { 
        "script_score": { 
         "script": { 
          "lang": "groovy", 
          "file": "test-score",       
          "params": { 
           "boostBy": 2 
          }      
         } 
        } 
       } 
      ]   
     } 
    } 
} 

Und das ist das, was kommt:

{ 
    "took": 6, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 3, 
     "max_score": 33738, 
     "hits": [ 
      { 
       "_index": "bank", 
       "_type": "account", 
       "_id": "998", 
       "_score": 33738, 
       "_source": { 
        "account_number": 998, 
        "balance": 16869, 
        "firstname": "Letha", 
        "lastname": "Baker", 
        "age": 40, 
        "gender": "F", 
        "address": "206 Llama Court", 
        "employer": "Dognosis", 
        "email": "[email protected]", 
        "city": "Dunlo", 
        "state": "WV" 
       } 
      }, 
      { 
       "_index": "bank", 
       "_type": "account", 
       "_id": "AVn6HUT-4vooOra1Vb9f", 
       "_score": 33246, 
       "_source": { 
        "account_number": 998, 
        "balance": 16623, 
        "firstname": "Bradshaw", 
        "lastname": "Mckenzie", 
        "age": 29, 
        "gender": "F", 
        "address": "244 Columbus Place", 
        "employer": "Euron", 
        "email": "[email protected]", 
        "city": "Hobucken", 
        "state": "CO", 
        "aggregations": { 
         "testing_n_grams": { 
          "avg": { 
           "script": { 
            "inline": "doc['grade'].value", 
            "lang": "painless" 
           } 
          } 
         } 
        } 
       } 
      }, 
      { 
       "_index": "bank", 
       "_type": "account", 
       "_id": "AVn6G6hA4vooOra1Vb9e", 
       "_score": 33246, 
       "_source": { 
        "account_number": 998, 
        "balance": 16623, 
        "firstname": "Bradshaw", 
        "lastname": "Mckenzie", 
        "age": 29, 
        "gender": "F", 
        "address": "244 Columbus Place", 
        "employer": "Euron", 
        "email": "[email protected]", 
        "city": "Hobucken", 
        "state": "CO", 
        "aggregations": { 
         "testing_n_grams": { 
          "script": { 
           "inline": "doc['firstname'].value", 
           "lang": "painless" 
          } 
         } 
        } 
       } 
      } 
     ] 
    } 
} 

ich nur das Konto mit der "max_score" teilnehmen möchte. Ist es möglich? Oder ich muss alles nehmen und woanders entscheidet, wie hoch die Punktzahl ist?

Und ich möchte auch, dass, wenn es mehr als ein Konto mit der max_score gibt, es jedes Konto mit der "max_score" zurückgibt. Deshalb funktioniert es nicht, wenn ich nur "size = 1" schreibe.

Sorry, wenn es eine dumme Frage ist, wie ich schon sagte, ich begann heute mit Elasticsearch und weiß nicht, wie es geht.

Vielleicht hat jemand da sowas schon einmal probiert.

Antwort

0

Ich habe keine gute Antwort finden. Also verwende ich "Größe": 1 wie Shadocko vorgeschlagen, wenn ich nur die erste brauche. Und wenn ich alle Daten benötige, die mit der max_score übereinstimmen, dann nehme ich einfach das ganze Datum und woanders habe ich entschieden, welche Daten die richtige sind.

0

Sie können begrenzen, wie viele Dokumente ES mit dem Parameter size zurückgeben wird.

{ 
    "query": { 
     [...snip...] 
    }, 
    "size": 1 
} 

reference

+0

danke für die Antwort! Ja, aber wenn es mehr als nur ein Dokument mit der maximalen Punktzahl gibt? ist es möglich, jedes Dokument zu nehmen, das dem max_score entspricht? –

Verwandte Themen