簡體   English   中英

查找與Mongo ODM的最佳搭配

[英]Find best match with Mongo ODM

我想在Symfony上找到與mongo odm查詢最匹配的內容。 我有一個功能,可以搜索帶有一系列術語的對象。

這是一個例子:

我想搜索所有命名為“ Paul”,“ Peter”和“ Smith”的用戶。 所以我的數組$ search = array('Paul','Peter','Smith');

我有3位使用者符合這個要求:

  • 彼得·安德森
  • 保羅·史密斯
  • 保羅·彼得·史密斯

所以我希望這個請求可以這樣命令用戶:

  1. 保羅·彼得·史密斯
  2. 保羅·史密斯
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM