php mongodb全文搜索和排序

时间:2014-04-15 12:50:05

标签: php mongodb sorting full-text-search

我需要使用全文索引进行搜索,此代码可以正常工作:

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

我尝试用以下方法对游标进行排序:

$cursor =$cursor->sort(array("score"=>1));

当我尝试阅读时

var_dump($cursor->getNext());
我给了我这个错误 未捕获的异常' MongoCursorException'使用消息' localhost:27017:不能规范化查询:BadValue在$ meta投影中无法进行非$ meta排序'

任何想法?

1 个答案:

答案 0 :(得分:5)

您正在尝试对元字段进行排序,而不是正常的字段名。

$collection->find()的第二个参数确定查询返回的文件的哪些字段(是/否)。

这类似于SQL数据库中的SELECT *... vs SELECT field1, field2 ...

现在,在MongoDB 2.6中,您可以使用其他关键字$meta。这个关键字允许你注入"将字段名放入返回文档中(否则实际上不存在)。这个注入的字段名的值将来自某种类型的元数据"您正在执行的文档或查询。

$text查询运算符是一个运算符的示例,其中包含有关匹配文档的更多信息。不幸的是,它无法告诉您有关此额外信息的信息,因为这样做会在意外情况下操纵您的文档办法。但它会将元数据附加到文档中 - 由您来决定是否需要它。

$ text运算符创建的元数据使用关键字" textScore"。如果要包含该数据,可以将其分配给您选择的字段名称:

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

例如,在$ text search(textScore)的情况下,我们可以注入字段名称"得分"将此数组作为第二个参数传递给$collection->find()

进入我们的文档
array("score" => array('$meta' => 'textScore'))

现在我们已经注入了一个名为"得分"进入我们的退货文件,其中包含" textScore"来自$ text搜索的值。

但由于这仍然只是文档的元数据,如果您想在执行查询之前继续在任何后续操作中使用此值,您仍然必须将其称为$ meta数据。

这意味着,要对字段进行排序,您必须对$meta projection

进行排序
array('score' => array('$meta' => 'textScore'))

然后您的完整示例变为:

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