vertigolabs / doctrine-full-text-postgres
使用 Doctrine 在 PostgreSQL 中实现全文搜索的工具
1.1.2
2021-10-04 20:55 UTC
Requires
- php: >=5.4
- doctrine/orm: ~2.4
Requires (Dev)
- phpunit/phpunit: ~4.4
- phpunit/phpunit-mock-objects: ~2.3
This package is auto-updated.
Last update: 2024-09-05 03:24:37 UTC
README
一套简单易用的数据库类型和注解,用于与 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
参数。还有可选的 weight
和 language
参数,但目前它们尚未使用。您不需要为 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 字段定义中
- 将语言和权重添加到查询中