2017-02-22 89 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