SQLAlchemy (配合 Postgres) - 如何将全文搜索限制在多个索引中的一列?
我在一个模型中定义了一个(Postgres)TSVECTOR列,具体如下:
def Model(Base):
#... Column Definitions (overview, funding, and other text columns) ..
funding = Column(Text)
overview = Column(Text)
etc..
index_tsvector = Column(TSVECTOR)
__table_args__ = (Index('cb_wikis_index', 'index_tsvector',postgresql_using='gin'), )
还有一个触发器,用来定义哪些内容会被索引,具体的SQL触发器定义如下:
CREATE TRIGGER index_tsvector_update
BEFORE INSERT OR UPDATE
ON "CrunchBase_startup_wikis"
FOR EACH ROW
EXECUTE PROCEDURE tsvector_update_trigger('index_tsvector', 'pg_catalog.english', 'competitors', 'funding', 'investments', 'overview');
这样做是有效的,而且速度非常快(比起LIKE搜索要快得多)。不过,我想限制一下在多个被index_tsvector索引的列中,匹配结果只能出现在某一列。
我的搜索查询是:
search_string = 'Cats & Dogs'
qry = session.query(Model).filter(Model.index_tsvector.op('@@')(func.to_tsquery(search_string))).all()
我不知道怎么限制搜索只在某一列(比如说,仅在'overview'列)进行。有没有办法让SQLAlchemy做到这一点?谢谢!
2 个回答
1
使用权重功能来实现这个。
setweight( to_tsvector(columnA), 'A') || setweight( to_tsvector(columnB), 'B') ...
在你的查询中:
'someValue:B'::tsquery
这将只搜索B列。
更多信息请查看这里: https://database-patterns.blogspot.com/2014/07/postgresql-text-search-multiple-columns.html
2
这可能有点晚了,但你可以通过只指定概述列来修改更新触发器:
CREATE TRIGGER index_tsvector_update
BEFORE INSERT OR UPDATE
ON "CrunchBase_startup_wikis"
FOR EACH ROW
EXECUTE PROCEDURE tsvector_update_trigger('index_tsvector', 'pg_catalog.english', 'overview');