来自@sharez的回答非常有用(特别是如果您需要在索引中连接列)。对于想要在单个列上创建tsvector GIN索引的任何人,您可以通过以下方式简化原始回答:
from sqlalchemy import Column, Index, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
Base = declarative_base()
class Example(Base):
__tablename__ = 'examples'
id = Column(Integer, primary_key=True)
textsearch = Column(String)
__table_args__ = (
Index(
'ix_examples_tsv',
func.to_tsvector('english', textsearch),
postgresql_using='gin'
),
)
请注意,在
__table_args__
中的
Index(...)
后面的逗号不是样式选择,
__table_args__
的值必须是元组、字典或
None
。
如果您确实需要在多个列上创建tsvector GIN索引,则可以使用
text()
另一种方法来实现。
from sqlalchemy import Column, Index, Integer, String, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
Base = declarative_base()
def to_tsvector_ix(*columns):
s = " || ' ' || ".join(columns)
return func.to_tsvector('english', text(s))
class Example(Base):
__tablename__ = 'examples'
id = Column(Integer, primary_key=True)
atext = Column(String)
btext = Column(String)
__table_args__ = (
Index(
'ix_examples_tsv',
to_tsvector_ix('atext', 'btext'),
postgresql_using='gin'
),
)
query.all()
报错:BinaryExpression
对象和Comparator
对象都没有属性all
。你能提供替代方法吗? - apalejamatch
是一个操作符,因此它应该在filter
方法内部,如下所示:Person.query.filter(Person.__ts_vector__.match(expressions, postgresql_regconfig='english')).all()
- Irmak Cakmak