向量器#
向量器提供了将各种列类型和列转变成全文搜索向量的工具。尽管 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
实例。将此用作装饰器,以将一个函数注册为矢量化器。