2015-10-25 4 views
1

настоящее время у меня что-то вдоль линий этого (взятый из SQLAlchemy documentation):Использование WhooshAlchemy с присоединяемой таблицы наследования

class Employee(Base): 
    __tablename__ = 'employee' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 
    type = Column(String(50)) 

    __mapper_args__ = { 
     'polymorphic_identity':'employee', 
     'polymorphic_on':type 
    } 

class Engineer(Employee): 
    __tablename__ = 'engineer' 
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    engineer_name = Column(String(30)) 

    __mapper_args__ = { 
     'polymorphic_identity':'engineer', 
    } 

class Manager(Employee): 
    __tablename__ = 'manager' 
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    manager_name = Column(String(30)) 

    __mapper_args__ = { 
     'polymorphic_identity':'manager', 
    } 

Использование WhooshAlchemy, я хотел бы сделать name колонку для поиска, но также и engineer_namemanager_name для Engineer и Manager класс соответственно.

Я пытался ставить отдельный __searchable__ список, содержащий их столбцы в каждом классе, но это дает мне следующую ошибку:

whoosh.fields.UnknownFieldError: No field named 'name' in <Schema: ['id', 'engineer_name']> 

Я также попытался положить __searchable__ список в каждом из них, который содержит только столбцы, определенные в этом конкретном классе, но это не дает мне никаких результатов, когда я использую whoosh_search по запросу, несмотря на наличие правильных условий поиска, которые должны возвращать хотя бы 1 результат.

Что это самый простой способ сделать это?

ответ

-1

колба-whooshalchemy dosen't

, если вы используете флягу тоже, вы можете попробовать мой форк flask_whooshalchemy имени Flask-WhooshAlchemyPlus, который может индексировать унаследовал модель

вы можете добавить для поиска собственных имен полей для каждой модели

Я просто вставить код здесь

def _get_whoosh_schema_and_primary_key(model, analyzer): 
    schema = {} 
    primary = None 
    searchable = set(model.__searchable__) 

    for field in model.__table__.columns: 
     if field.primary_key: 
      schema[field.name] = whoosh.fields.ID(stored=True, unique=True) 
      primary = field.name 

     if field.name in searchable and isinstance(field.type, 
               (sqlalchemy.types.Text, 
               sqlalchemy.types.String, 
               sqlalchemy.types.Unicode)): 
      schema[field.name] = whoosh.fields.TEXT(
       analyzer=analyzer, vector=True) 

    for parent_class in model.__bases__: 
     if hasattr(parent_class, "_sa_class_manager"): 
      if parent_class.__searchable__: 
       for i in set(parent_class.__searchable__): 
        if hasattr(parent_class, i): 
         schema[i] = whoosh.fields.TEXT(
          analyzer=analyzer, vector=True) 

    return Schema(**schema), primary 
0

Вы должны явно определить схему, которая может обрабатывать все из них. Вы бы переопределили поля поиска в унаследованных классах.

class Employee(Base): 
    __tablename__ = 'employee' 
    __searchable__ = ['name'] 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 
    type = Column(String(50)) 

    __mapper_args__ = { 
     'polymorphic_identity':'employee', 
     'polymorphic_on':type 
    } 

class Engineer(Employee): 
    __tablename__ = 'engineer' 
    __searchable__ = ['name', 'engineer_name'] 
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    engineer_name = Column(String(30)) 

    __mapper_args__ = { 
     'polymorphic_identity':'engineer', 
    } 

class Manager(Employee): 
    __tablename__ = 'manager' 
    __searchable__ = ['name', 'manager_name '] 
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    manager_name = Column(String(30)) 

    __mapper_args__ = { 
     'polymorphic_identity':'manager', 
    } 

Затем, когда вы строите свой индекс:

from whooshalchemy import IndexService 
from whoosh.fields import Schema, TEXT 

# However your app initializes it 
index_service = IndexService(config=app.config, session=db.session) 

my_schema = Schema(name=TEXT, engineer_name=TEXT, manager_name=TEXT) 
index = index_service.index_for_model_class(model) 

with index.writer() as writer: 

    for engineer in Engineer.query.all(): 
     index_attrs = {} 
     for field in Engineer.__searchable__: 
      index_attrs[field] = str(getattr(engineer, field)) 

     index_attrs["id"] = engineer.id 

     writer.add_document(**index_attrs) 

    for manager in Manager.query.all(): 
     index_attrs = {} 
     for field in Manager.__searchable__: 
      index_attrs[field] = str(getattr(manager, field)) 

     index_attrs["id"] = manager.id 

     writer.add_document(**index_attrs) 

И потом при поиске:

engineer_search_results = Engineer.search_query("SomeText").all() 
manager_search_results = Manager.search_query("SomeText").all() 
Смежные вопросы