MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

php mongodb pesquisa e classificação de texto completo


Você está tentando classificar em um metacampo, não em um nome de campo normal.

O segundo argumento para $collection->find() determina quais campos do documento você (não) deseja que sejam retornados pela consulta.

Isso é semelhante a SELECT *... vs SELECT field1, field2 ... em bancos de dados SQL.

Agora, no MongoDB 2.6, há uma palavra-chave adicional que você pode usar aqui, $meta. Esta palavra-chave permite que você "injete" nomes de campo no documento de retorno (que de outra forma não existiria). O valor desse nome de campo injetado viria de algum tipo de "metadados" do documento ou consulta que você está executando.

O operador $text query é um exemplo de operador que tem mais informações disponíveis sobre o documento correspondente. No entanto, ele anexa um metadados ao documento - e cabe a você decidir se precisa dele ou não.

Os metadados que o operador $text cria usam a palavra-chave "textScore". Se você quiser incluir esses dados, poderá fazê-lo atribuindo-os a um nome de campo de sua escolha:
array("myFieldname" => array('$meta' => 'keyword'))

Por exemplo, no caso de $text search (textScore) podemos injetar o fieldname "score" em nosso documento passando este array como o segundo argumento para $collection->find() :
array("score" => array('$meta' => 'textScore'))

Agora injetamos um campo chamado "score" em nosso documento de retorno que tem o valor "textScore" da pesquisa $text.

Mas como isso ainda é apenas metadados do documento, se você quiser continuar a usar esse valor em qualquer operação subsequente antes de executar a consulta, ainda precisará se referir a ele como $ meta dados.

Isso significa que, para classificar no campo, você deve classificar na projeção $ meta
array('score' => array('$meta' => 'textScore'))

Seu exemplo completo então se torna:
<?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);
}