向量器#

向量器提供了将各种列类型和列转变成全文搜索向量的工具。尽管 PostgreSQL 固有地知道如何将字符串列矢量化,但在其他情况下可能还需要其他矢量化规则。本部分概述了如何为特定列实例和列类型创建和使用矢量化规则。

类型向量器#

默认情况下,PostgreSQL 只能直接将字符串列矢量化。然而,在将非字符串列矢量化变为必需的情况下可能会出现问题。例如,在模型中处理需要全文索引的 HSTORE 列时,必须定义专属矢量化规则。

要建立矢量化规则,请使用 vectorizer 装饰器。以下示例演示如何将矢量化规则应用于模型中所有 HSTORE 类型列中的值

from sqlalchemy import cast, func, Text
from sqlalchemy.dialects.postgresql import HSTORE
from sqlalchemy_searchable import vectorizer


@vectorizer(HSTORE)
def hstore_vectorizer(column):
    return cast(func.avals(column), Text)

然后在全文索引中,向量器返回的表达式将用于类型为 HSTORE 的所有列中。考虑以下模型

from sqlalchemy import Column, Integer
from sqlalchemy_utils import TSVectorType


class Article(Base):
    __tablename__ = 'article'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name_translations = Column(HSTORE)
    content_translations = Column(HSTORE)
    search_vector = Column(
        TSVectorType(
            "name_translations",
            "content_translations",
        )
    )

在此示例中,SQLAlchemy-Searchable 将使用默认配置为模型创建以下搜索触发器

CREATE FUNCTION
    article_search_vector_update() RETURNS TRIGGER AS $$
BEGIN
    NEW.search_vector = to_tsvector(
        'pg_catalog.english',
        coalesce(CAST(avals(NEW.name_translations) AS TEXT), '')
    ) || to_tsvector(
        'pg_catalog.english',
        coalesce(CAST(avals(NEW.content_translations) AS TEXT), '')
    );
    RETURN NEW;
END
$$ LANGUAGE 'plpgsql';

列向量器#

有时,您可能只希望为特定列设置特殊的向量器。它可以按照如下方式实现

class Article(Base):
    __tablename__ = "article"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name_translations = Column(HSTORE)
    search_vector = Column(TSVectorType("name_translations"))


@vectorizer(Article.name_translations)
def name_vectorizer(column):
    return cast(func.avals(column), Text)

注意

列向量器的优先级始终高于类型向量器。

API#

sqlalchemy_searchable.vectorizer = <sqlalchemy_searchable.vectorizers.Vectorizer object>#

跟踪已注册矢量化器的 Vectorizer 实例。将此用作装饰器,以将一个函数注册为矢量化器。

class sqlalchemy_searchable.Vectorizer(type_vectorizers=None, column_vectorizers=None)[source]#
__call__(type_or_column)[source]#

装饰器,用以将一个函数注册为矢量化器。

参数:

type_or_column – 用于为其注册矢量化器的 SQLAlchemy 数据库数据类型或列

clear()[source]#

清除所有已注册的矢量化器。