有一些方法可以使用 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/