vertigolabs/doctrine-full-text-postgres

使用 Doctrine 在 PostgreSQL 中实现全文搜索的工具

1.1.2 2021-10-04 20:55 UTC

This package is auto-updated.

Last update: 2024-09-05 03:24:37 UTC


README

SensioLabsInsight

一套简单易用的数据库类型和注解,用于与 doctrine 一起使用 PostgreSQL 的全文搜索引擎

安装

  • 注册 Doctrine 注解
\Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace("VertigoLabs\\DoctrineFullTextPostgres\\ORM\\Mapping\\");
  • 注册 Doctrine 类型
Type::addType('tsvector',\VertigoLabs\DoctrineFullTextPostgres\ORM\Mapping\TsVectorType::class);
  • 注册 Doctrine 事件订阅者
$this->em->getEventManager()->addEventSubscriber(new \VertigoLabs\DoctrineFullTextPostgres\Common\TsVectorSubscriber());
  • 注册 Doctrine 函数
$doctrineConfig->addCustomStringFunction('tsquery', \VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsQueryFunction::class);
$doctrineConfig->addCustomStringFunction('tsplainquery', \VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsPlainQueryFunction::class);
$doctrineConfig->addCustomStringFunction('tsrank', \VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsRankFunction::class);
$doctrineConfig->addCustomStringFunction('tsrankcd', \VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsRankCDFunction::class);

Symfony 安装

  • 添加到配置
doctrine:
    dbal:
        types:
            tsvector:   VertigoLabs\DoctrineFullTextPostgres\DBAL\Types\TsVector
        mapping_types:
            tsvector: tsvector
    orm:
        entity_managers:
            default:
                dql:
                    string_functions:
                        tsquery: VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsQueryFunction
                        tsplainquery: VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsPlainQueryFunction
                        tsrank: VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsRankFunction
                        tsrankcd: VertigoLabs\DoctrineFullTextPostgres\ORM\Query\AST\Functions\TsRankCDFunction

services:
        vertigolabs.doctrinefulltextpostgres.listener:
                 class: VertigoLabs\DoctrineFullTextPostgres\Common\TsVectorSubscriber
                 tags:
                     - { name: doctrine.event_subscriber, connection: default }

使用

  • 创建实体

您不需要为将存储全文搜索向量的字段(tsvector)创建列注解,这些列将自动创建。TsVector 注解只需要 fields 参数。还有可选的 weightlanguage 参数,但目前它们尚未使用。您不需要为 TsVector 字段设置数据,数据将在对象刷新到数据库时自动从 fields 属性中指定字段获取

use VertigoLabs\DoctrineFullTextPostgres\ORM\Mapping\TsVector;

class Article
{
    /**
     * @var string
     * @Column(name="title", type="string", nullable=false)
     */
    private $title;

    /**
     * @var TsVector
     * @TsVector(name="title_fts", fields={"title"})
     */
    private $titleFTS;

    /**
     * @var string
     * @Column(name="body", type="text", nullable=true)
     */
    private $body;

     /**
     * @var TsVector
     * @TsVector(name="body_fts", fields={"body"})
     */
    private $bodyFTS;
}
  • 插入一些数据

您不需要担心将数据设置到带有 TsVector 注解的字段中。当您将更改刷新到数据库时,这些字段的数据将自动填充。

$article = new Article();
$article->setTitle('Baboons Invade Seaworld');
$article->setBody('In a crazy turn of events a pack a rabid red baboons invade Seaworld. Officials say that the Dolphins are being held hostage');
$this->em->persist($article);
$this->em->flush();
  • 查询数据库!

当您查询数据库时,您将针对实际数据进行查询。查询将自动修改以使用带有 TsVector 注解的字段进行搜索

$query = $this->em->createQuery('SELECT a FROM Article a WHERE tsquery(a.title,:searchQuery) = true');
$query->setParameter('searchQuery','Baboons');
$result = $query->getArrayResult();

如果您想检索全文搜索的排名,只需使用 tsrank 函数即可

$query = $this->em->createQuery('SELECT a, tsrank(a.title,:searchQuery) as rank FROM Article a WHERE tsquery(a.title,:searchQuery) = true');
$query->setParameter('searchQuery','Baboons');
$result = $query->getArrayResult();

var_dump($result[0]['rank']); // int 0.67907

您甚至可以根据排名排序

$query = $this->em->createQuery('SELECT a FROM Article a WHERE tsquery(a.title,:searchQuery) = true ORDER BY tsrank(a.title,:searchQuery) DESC');

TODO

  • 将语言添加到 SQL 字段定义中
  • 将语言和权重添加到查询中