MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

php mongodb Volltextsuche und -sortierung

Sie versuchen, nach einem Metafeld zu sortieren, nicht nach einem normalen Feldnamen.

Das zweite Argument für $collection->find() legt fest, welche Felder des Dokuments Sie (nicht) von der Abfrage zurückgeben möchten.

Dies ist vergleichbar mit SELECT *... vs SELECT field1, field2 ... in SQL-Datenbanken.

Jetzt gibt es in MongoDB 2.6 ein zusätzliches Schlüsselwort, das Sie hier verwenden können, $meta. Mit diesem Schlüsselwort können Sie Feldnamen in das Rückgabedokument "einfügen" (die sonst nicht existieren würden). Der Wert dieses eingefügten Feldnamens würde aus einer Art "Metadaten" des Dokuments oder der Abfrage stammen, die Sie ausführen.

Der $text-Abfrageoperator ist ein Beispiel für einen Operator, der mehr Informationen über das übereinstimmende Dokument bereithält. Leider hat er keine Möglichkeit, Ihnen diese zusätzlichen Informationen mitzuteilen, da dies Ihr Dokument auf unerwartete Weise manipulieren würde. Es hängt jedoch Metadaten an das Dokument an - und es liegt an Ihnen zu entscheiden, ob Sie diese benötigen oder nicht.

Die vom $text-Operator erstellten Metadaten verwenden das Schlüsselwort „textScore“. Wenn Sie diese Daten einschließen möchten, können Sie dies tun, indem Sie sie einem Feldnamen Ihrer Wahl zuweisen:

array("myFieldname" => array('$meta' => 'keyword'))

Im Fall von $text search (textScore) können wir beispielsweise den Feldnamen „score“ in unser Dokument einfügen, indem wir dieses Array als zweites Argument an $collection->find() übergeben :

array("score" => array('$meta' => 'textScore'))

Jetzt haben wir ein Feld namens "score" in unser Rückgabedokument eingefügt, das den "textScore"-Wert aus der $text-Suche enthält.

Da dies jedoch immer noch nur Metadaten des Dokuments sind, müssen Sie, wenn Sie diesen Wert in nachfolgenden Operationen vor der Ausführung der Abfrage weiterhin verwenden möchten, immer noch als $Metadaten darauf verweisen.

Das heißt, um nach dem Feld zu sortieren, müssen Sie nach der $meta-Projektion

sortieren
array('score' => array('$meta' => 'textScore'))

Ihr vollständiges Beispiel wird dann zu:

<?php
$mc = new MongoClient();


$collection = $mc->selectCollection("myDatabase", "myCollection");

$string = "search string";
$cursor = $collection->find(
    array('$text' => array('$search' => $string)),
    array('score' => array('$meta' => 'textScore'))
);

$cursor = $cursor->sort(
    array('score' => array('$meta' => 'textScore'))
);

foreach($cursor as $document) {
    var_dump($document);
}