【问题标题】:php mongodb full-text search and sortphp mongodb全文搜索和排序
【发布时间】:2014-04-15 12:50:04
【问题描述】:

我需要使用全文索引进行搜索,并且此代码有效:

$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 排序”

有什么想法吗?

【问题讨论】:

  • 尝试从 find() 中消除“分数”搜索条件。很可能它不允许查找和排序相同的键值。
  • 但是如果我从 db.collection.find() 的第二个字段中消除,我如何要求对基于搜索的字段进行排序,我如何保存构建为的分数元数据?我试图消除,但排序不起作用我应该怎么写?谢谢
  • 仅供参考:您的数组周围有额外的 () ('$search'=>$s)。有关 sort() 解决方案,请参阅下面的答案

标签: php mongodb sorting full-text-search


【解决方案1】:

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

$collection->find() 的第二个参数确定您(希望/不希望)查询返回文档的哪些字段。

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

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

$text 查询运算符是一个运算符示例,该运算符具有有关匹配文档的更多可用信息。不幸的是,它无法告诉您这些额外信息,因为这样做会以意想不到的方式操纵您的文档。但是,它确实将元数据附加到文档中 - 由您决定是否需要它。

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

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

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

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

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

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

这意味着,要对字段进行排序,您必须在 $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);
}

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多