使用 TypeOrm 进行 Postgresql 全文搜索

标签 postgresql typeorm

有一些方法可以使用 Postgres 和 TypeOrm 处理全文搜索。我看过一些例子,但它们只适用于 Mysql。我怎样才能得到与这个相同的东西,但使用 Postgresql?

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: string;

    @Index({ fulltext: true })
    @Column("varchar")
    name: string;
}

并使用查询构建器:
const searchTerm = "John";

const result = await connection.manager.getRepository(User)
            .createQueryBuilder()
            .select()
            .where(`MATCH(name) AGAINST ('${searchTerm}' IN BOOLEAN MODE)`)
            .getMany();

最佳答案

这是使用 tsvector 的替代方法,其中 query 是输入字符串。

      const songs = await getManager()
        .createQueryBuilder()
        .select('song')
        .from(Models.Song, 'song')
        .where(
          'to_tsvector(song.title) @@ to_tsquery(:query)',
          { query }
        )
        .getMany();
如果您希望包含停用词(您、A 等),并希望进行部分匹配。
      const songs = await getManager()
        .createQueryBuilder()
        .select('song')
        .from(Models.Song, 'song')
        .where(
          `to_tsvector('simple',song.title) @@ to_tsquery('simple', :query)`,
          { query: `${query}:*` }
        )
        .getMany();

如果您还想允许多字串(带空格)。
      const formattedQuery = query.trim().replace(/ /g, ' & ');
      const songs = await getManager()
        .createQueryBuilder()
        .select('song')
        .from(Models.Song, 'song')
        .where(
          `to_tsvector('simple',song.title) @@ to_tsquery('simple', :query)`,
          { query: `${formattedQuery}:*` }
        )
        .getMany();

关于使用 TypeOrm 进行 Postgresql 全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59849262/

相关文章:

java - postgresql jdbc 中的结果集关闭问题

TypeORM 多态关系

node.js - 如何从 typeorm postgreSQL 中获取软删除的实体?

typescript - 生成两个具有不同装饰器选项的类

postgresql - 慢触发器使用 postgresql 检查主键约束

PostgreSQL 客户端——如何启动它?

postgresql - 删除大型 postgresql 数据库表中的重复行

java - 使用 GenerationType.SEQUENCE 生成负 Id 值

sqlite - "PRAGMA foreign_keys=OFF"SQLite 语句可以在 TypeORM 迁移中使用吗?

node.js - 在我的模块中的 Nestjs 中导入另一个模块的存储库