2017-02-22 25 views
2

PythonでSQLAlchemyを使用してPostgreSQL全文検索インデックスを作成する必要があります。ここで私はSQLで何をしたいのです:ORMを使用しているときPostgreSQLでSQLAlchemyで全文検索インデックスを作成

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

今どのように私は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