[英]Find best match with Mongo ODM
我想在Symfony上找到与mongo odm查询最匹配的内容。 我有一个功能,可以搜索带有一系列术语的对象。
这是一个例子:
我想搜索所有命名为“ Paul”,“ Peter”和“ Smith”的用户。 所以我的数组$ search = array('Paul','Peter','Smith');
我有3位使用者符合这个要求:
所以我希望这个请求可以这样命令用户:
这是我目前的方法:
public function search($search) {
$query = $this->createQueryBuilder('AcmeDataBundle:users');
$users = $query
->field('name')->in($search)
->getQuery()->execute();
return $users;
}
您对我该怎么做有任何线索吗?
谢谢
让我们忘了php,看看如何首先使用MongoDB本身(使用js)实现它。
当您要具有“文本搜索”功能时,必须在要搜索的字段上创建一个TEXT INDEX 。 资源
可以通过以下方式实现:
db.yourCollectionName.createIndex({ fieldName: "text" })
此后,每当进行文本搜索时 ,您都会有一些与查询相关的元数据 ,其中包含MongoDB根据结果与关键字的相关性生成的一些分数。
因此,因为您想首先获得最准确的结果,所以我们只应按该分数排序 。
在您的情况下,它将是:
db.User.createIndex( { name: "text" } )
db.User.find(
{$text:{$search:"Paul Smith Peter"}},
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } );
好的。 这会给你你想要的。 但让我们将其转换为Doctrine查询样式。
对于索引:
/**
* @ODM\Document
* @ODM\Indexes({
* @ODM\Index(keys={"name"="text"})
* })
*/
class User{
/** @ODM\String */
private $name;
//...
}
然后运行以下命令以确保已创建方案和索引:
php app/console doctrine:mongodb:schema:create
最后一部分:
$search = ['Paul', 'Peter', 'Smith'];
$names = implode(' ', $search);
$queryBuilder = $documentManager->createQueryBuilder('User');
$expr = $queryBuilder->expr()->operator('$text', array('$search' => $names));
$result = $queryBuilder
->equals($expr->getQuery())
->sortMeta('score', 'textScore')
->getQuery();
foreach ($result as $user) {
var_dump($user);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.