使用 Expose 在 Ktor 中定义和使用 PostgreSQL 的 ts_vector 列类型

问题描述 投票:0回答:1

我已经在 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()

这种做法正确吗?如果是的话,我很难理解逻辑如何使用它来根据用户的查询进行搜索。

postgresql kotlin ktor kotlin-exposed
1个回答
0
投票

幸运的是,我通过为 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() }
    
© www.soinside.com 2019 - 2024. All rights reserved.