我已经在 PostgreSQL 数据库的相关表中创建了 ts_vector 列,现在需要在公开表和实体中添加相应的列类型,以便我可以通过我的端点执行 FTS。
我还没有找到任何有关如何执行此操作的文档,这是我迄今为止尝试过的:
private const val TS_VECTOR_SQL_TYPE = "tsvector"
class TsVectorColumnType : ColumnType<String>() {
override fun sqlType(): String = TS_VECTOR_SQL_TYPE
override fun valueFromDB(value: Any): String? {
return value as String
}
override fun valueToDB(value: String?): Any? {
return PGobject().apply {
type = TS_VECTOR_SQL_TYPE
this.value = value
}.value
}
override fun notNullValueToDB(value: String): Any {
return PGobject().apply {
type = TS_VECTOR_SQL_TYPE
this.value = value
}
}
override fun nonNullValueToString(value: String): String {
return "'$value'"
}
}
尝试为其创建自定义列类型,然后在表定义中像这样使用它
val tsvectorContent = TsVectorColumnType()
。
这种做法正确吗?如果是的话,我很难理解逻辑如何使用它来根据用户的查询进行搜索。
幸运的是,我通过为 ts_vector 列创建自定义列类型以及保存该内容以及相关项目 ID 的相应表,成功地完成了这项工作。
我还在公开中创建了一些自定义运算符和表达式,以便继续使用其 DSL。此外,我不知道是否可以接受在此发表我自己的文章,所以如果不可以,请告诉我,我会将其删除。
您可以在我的子堆栈上找到我在上述文章中遵循的整个流程。
如果您只想获取此问题的相关部分,请看:
private const val TS_VECTOR_SQL_TYPE = "tsvector"
class TsVectorColumnType : ColumnType<String>(nullable = true) {
override fun sqlType(): String = TS_VECTOR_SQL_TYPE
override fun valueFromDB(value: Any): String? {
return value as String
}
override fun valueToDB(value: String?): Any? {
return PGobject().apply {
type = TS_VECTOR_SQL_TYPE
this.value = value
}.value
}
override fun notNullValueToDB(value: String): Any {
return PGobject().apply {
type = TS_VECTOR_SQL_TYPE
this.value = value
}
}
override fun nonNullValueToString(value: String): String {
return "'$value'"
}
}
然后使用以下方式注册:
object ResearchLabsTsVectorTable : IntIdTable("labs_tsvector") {
val researchLab = reference("research_lab_id", ResearchLabTable, onDelete = ReferenceOption.CASCADE)
val tsvectorContent = registerColumn<String>("tsvector_content", TsVectorColumnType()).databaseGenerated()
}