php mongodb全文搜索和排序

前端之家收集整理的这篇文章主要介绍了php mongodb全文搜索和排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要使用全文索引进行搜索,此代码可以正常工作:
$cursor=$collection->find(array('$text'=>(array('$search'=>$s))),array("score"=> array('$Meta'=>"textscore"))
        );

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

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

当我试着读

var_dump($cursor->getNext());

我给了我这个错误
带有消息’localhost:27017的未捕获异常’MongoCursorException’:无法规范化查询:BadValue不能对$Meta投影进行非$Meta排序’

任何想法?

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

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

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

现在,在MongoDB 2.6中,你可以使用一个额外的关键字,$meta.这个关键字允许你将字段名“注入”到返回文档中(否则实际上不存在).此注入的fieldname的值将来自您正在执行的文档或查询的某种“元数据”.

$text查询运算符是一个运算符的示例,其中包含有关匹配文档的更多可用信息.不幸的是,它无法告诉您有关此额外信息的信息,因为这样做会以意外方式操作您的文档.但它会将元数据附加到文档中 – 由您来决定是否需要它.

$text运算符创建的元数据使用关键字“textscore”.如果要包含该数据,可以通过将其分配给您选择的字段名称来实现:

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

例如,在$text search(textscore)的情况下,我们可以通过将此数组作为第二个参数传递给$collection->find(),将字段名称score”注入到我们的文档中:

array("score" => array('$Meta' => 'textscore'))

现在我们在返回文档中注入了一个名为“score”的字段,该文档具有来自$text搜索的“textscore”值.

但由于这仍然只是文档的元数据,如果您想在执行查询之前继续在任何后续操作中使用此值,您仍然必须将其称为$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);
}
原文链接:https://www.f2er.com/php/138311.html

猜你在找的PHP相关文章