用于PHP的新MongoDB驱动程序中的全文搜索分数投影

时间:2016-10-28 17:34:00

标签: php mongodb full-text-search projection

我正在从旧的PHP MongoDB驱动程序升级我的代码: http://php.net/manual/en/class.mongoclient.php

到新的MongoDB驱动程序: http://php.net/manual/en/set.mongodb.php

在以前的版本中我有这个:

$db->collection->find([ 
  '$text' => [ '$search' => "stackoverflow" ]
],
[ 
  'score' => [ '$meta' => 'textScore' ]
])->sort([ 'sort' => [ 'score' => [ '$meta' => 'textScore' ] ] ]);

在新版本中,光标上没有任何排序功能,您必须将其作为选项传递。所以新代码是这样的:

$db->collection->find([ 
    '$text' => [ '$search' => 'stackoverflow' ]
],
[ 
  'score' => [ '$meta' => 'textScore' ],
  'sort' => [ 'score' => [ '$meta' => 'textScore' ] ]
]);

但我收到一个错误: “BadValue必须为所有$ meta排序键提供$ meta投影”

这是因为,分数预测不再发生了。如果您只是删除排序选项和日志结果,您将看到结果数组中没有得分。根本没有关于它的文档。

有谁知道如何解决这个问题?

谢谢

2 个答案:

答案 0 :(得分:4)

如果要搜索Mongo文本索引并使用新的PHP驱动程序对textScore字段进行排序,则必须使用Query类,在那里添加过滤器和选项,然后使用Manager类执行。在你的情况下,它将是这样的:

$filter = [
    '$text' => ['$search' => 'stackoverflow']];

$options =  [
    'projection' => [
        'score' => ['$meta' => 'textScore']
            ],
    'sort' => [
        'score' => ['$meta' => 'textScore']
        ]
];

$mng = new MongoDB\Driver\Manager("mongodb://yourdbserver:27017");
$mongoQuery = new MongoDB\Driver\Query($filter, $options);
$cursor = $mng->executeQuery('db_name.collection_name', $mongoQuery);

请参阅Query class的文档页面,第一个注释似乎非常有用。

答案 1 :(得分:0)

也可以通过这种方式完成:

$collection = (new MongoDB\Client)->DB->COLLECTION;
$cursor = $collection->find(
                ['$text' => ['$search' => 'stackoverflow']],
                [
                'projection' => [
                    'score' => ['$meta' => 'textScore']
                    ],
                'sort' => [
                    'score' => ['$meta' => 'textScore']
                    ]
                ]
            );

并带有跳过和限制:

$collection = (new MongoDB\Client)->DB->COLLECTION;
$cursor = $collection->find(
                ['$text' => ['$search' => 'stackoverflow']],
                ['skip' => 0, 
                'limit' => 20,
                'projection' => [
                    'score' => ['$meta' => 'textScore']
                    ],
                'sort' => [
                    'score' => ['$meta' => 'textScore']
                    ]
                ]
            );