2017-02-22 109 views
2

我需要使用SQLAlchemy在Python中创建PostgreSQL全文搜索索引。这是我想在SQL:在PostgreSQL上使用SQLAlchemy创建全文搜索索引

CREATE TABLE person (id INTEGER PRIMARY KEY, name TEXT); 
CREATE INDEX person_idx ON person USING GIN (to_tsvector('simple', name)); 

现在使用ORM的时候我怎么做的第二部分用的SQLAlchemy:

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 

回答

5

你可以在__table_args__使用Index创建索引。此外,我使用一个函数来创建ts_vector,以使其更加整洁并且可重用,如果需要多个字段。类似下面:

from sqlalchemy.dialects import postgresql 

def create_tsvector(*args): 
    exp = args[0] 
    for e in args[1:]: 
     exp += ' ' + e 
    return func.to_tsvector('english', exp) 

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 

    __ts_vector__ = create_tsvector(
     cast(func.coalesce(name, ''), postgresql.TEXT) 
    ) 

    __table_args__ = (
     Index(
      'idx_person_fts', 
      __ts_vector__, 
      postgresql_using='gin' 
     ) 
    ) 

更新: 示例查询使用索引:

query = Person.__ts_vector__.match(expressions, postgresql_regconfig='english') 
people = query.all() 
+1

感谢队友,这奇妙的作品! :) –

+0

你可以给一个例子如何查询矢量?谢谢。 –

+0

@JakobKristensen我更新了答案。 – Sharez