40 Stimmen

Zufälliges Dokument in ElasticSearch

Gibt es eine Möglichkeit, eine wirklich zufällige Stichprobe aus einem elasticsearch-Index zu erhalten? d.h. eine Abfrage, die jedes Dokument aus dem Index mit einer Wahrscheinlichkeit 1/N abruft (wobei N die Anzahl der derzeit indexierten Dokumente ist)?

Und als Follow-up-Frage: Wenn alle Dokumente ein numerisches Feld s haben, gibt es eine Möglichkeit, ein Dokument durch gewichtete Zufallsauswahl zu erhalten, d.h. wo die Wahrscheinlichkeit, das Dokument i mit Wert s_i zu erhalten, gleich s_i / sum(s_j für j im Index) ist?

77voto

Adam Wallner Punkte 2036

Ich weiß, es ist eine alte Frage, aber jetzt ist es möglich, random_score zu verwenden, mit der folgenden Suchabfrage:

{
   "size": 1,
   "query": {
      "function_score": {
         "functions": [
            {
               "random_score": {
                  "seed": "1477072619038"
               }
            }
         ]
      }
   }
}

Für mich ist es sehr schnell mit etwa 2 Millionen Dokumenten.

Ich verwende den aktuellen Zeitstempel als Seed, aber du kannst alles verwenden, was du möchtest. Am besten ist es, wenn du denselben Seed verwendest, wirst du die gleichen Ergebnisse erhalten. Du kannst also die Session-ID deines Benutzers als Seed verwenden und alle Benutzer werden eine andere Reihenfolge haben.

7voto

Alcanzar Punkte 16707

Der einzige Weg, von dem ich weiß, wie man zufällige Dokumente aus einem Index erhält (zumindest in Versionen <= 1.3.1), ist die Verwendung eines Skripts:

sort: {
  _script: {
    script: "Math.random() * 200000",
    type: "number",
    params: {},
    order: "asc"
 }
}

Sie können dieses Skript verwenden, um eine Gewichtung basierend auf einem Feld des Datensatzes vorzunehmen.

Es ist möglich, dass sie in Zukunft etwas Komplizierteres hinzufügen könnten, aber wahrscheinlich müssten Sie das beim ES-Team anfragen.

6voto

JnBrymn Punkte 22642

Sie können random_score mit einer function_score Abfrage verwenden.

{
    "size":1,
    "query": {
        "function_score": {
            "functions": [
                {
                    "random_score":  {
                        "seed": 11
                    }
                }
            ],
            "score_mode": "sum",
        }
    }
}

Der Nachteil ist, dass dies jedem Dokument einen zufälligen Score zuweist, die Dokumente sortiert und dann das erste zurückgibt. Ich kenne nichts, das klug genug ist, um einfach ein zufälliges Dokument auszuwählen.

4voto

Eran Peled Punkte 591

NEST Weg :

var result = _elastic.Search(s => s
        .Query(q => q
        .FunctionScore(fs => fs.Functions(f => f.RandomScore())
        .Query(fq => fq.MatchAll()))));

roher Abfrage Weg :

 GET index-name/_search
    "size": 1,
    "query": {
        "function_score": {
                "query" : { "match_all": {} },
               "random_score": {}
        }
    }
}

2voto

nycdatawrangler Punkte 670

Sie können random_score verwenden, um Antwortoptionen zufällig anzuordnen oder ein Dokument mit ungefährer Wahrscheinlichkeit von 1/N abzurufen.

Zusätzliche Hinweise:

https://github.com/elastic/elasticsearch/issues/1170 https://github.com/elastic/elasticsearch/issues/7783

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X