sql >> Base de Datos >  >> NoSQL >> MongoDB

php mongodb búsqueda y clasificación de texto completo

Está intentando ordenar un metacampo, no un nombre de campo normal.

El segundo argumento de $collection->find() determina qué campos del documento desea (o no) que devuelva la consulta.

Esto es similar a SELECT *... vs SELECT field1, field2 ... en bases de datos SQL.

Ahora, en MongoDB 2.6 hay una palabra clave adicional que puede usar aquí, $meta. Esta palabra clave le permite "inyectar" nombres de campo en el documento de devolución (que de otro modo no existirían). El valor de este nombre de campo inyectado provendría de algún tipo de "metadatos" del documento o consulta que está ejecutando.

El operador de consulta $text es un ejemplo de un operador que tiene más información disponible sobre el documento coincidente. Desafortunadamente, no tiene forma de informarle sobre esta información adicional, ya que hacerlo manipularía su documento de forma inesperada. Sin embargo, adjunta metadatos al documento, y depende de usted decidir si los necesita o no.

Los metadatos que crea el operador $text utilizan la palabra clave "textScore". Si desea incluir esos datos, puede hacerlo asignándolos a un nombre de campo de su elección:

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

Por ejemplo, en el caso de $text search (textScore) podemos inyectar el nombre de campo "score" en nuestro documento pasando esta matriz como segundo argumento a $collection->find() :

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

Ahora hemos inyectado un campo llamado "puntuación" en nuestro documento de devolución que tiene el valor "textScore" de la búsqueda de $texto.

Pero dado que esto sigue siendo solo metadatos del documento, si desea continuar usando este valor en cualquier operación posterior antes de ejecutar la consulta, aún debe referirse a él como $metadatos.

Esto significa que, para ordenar en el campo, debe ordenar en la $meta proyección

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

Su ejemplo completo se convierte en:

<?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);
}