首页 > 解决方案 > 数据库中的多对多表不适用于弹性搜索

问题描述

我有一个在 Flask 和 sqlalchemy 上运行的网站,其中项目可以有多个标签。这种多对多关系由中间表 ( tag_map) 支持。可搜索的模型由Miguel Grinberg 的烧瓶教程中定义的 SearchableMixin 类组成。所涉及的表的一般结构是:

from app import db

# the many-to-many table
tag_map = db.Table('tag_map', 
        db.Column('project_id', db.Integer, db.ForeignKey('project.id')),
        db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')) )

...

class Project(SearchableMixin, db.Model):
    __searchable__ = [...,'tags']
    ...
    tags = db.relationship( 
        'Tag', secondary=tag_map,
        backref=db.backref('tag_map', lazy='dynamic'), lazy='dynamic')


class Tag(SearchableMixin, db.Model):
    __searchable__ = ['name']
    ...
    name = db.Column(db.String(25))
    
    tags = db.relationship( 
        'Project', secondary=tag_map,
        backref=db.backref('tag_map', lazy='dynamic'), lazy='dynamic') 

当我使用我网站的搜索栏搜索标签时,什么也没有出现。当我尝试从特定项目中删除标签时,我收到以下形式的 SerializationError:

elasticsearch.exceptions.SerializationError: ({'category': 'learning', 'name': '236', 'descr': 
'.', 'tags': <sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x7ffbbc8c0810>}, 
TypeError("Unable to serialize <sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x7ffbbc8c0810> 
(type: <class 'sqlalchemy.orm.dynamic.AppenderBaseQuery'>)"))

我猜这Project.tags应该适应可搜索的mixin,但我不确定如何。如何使我的多对多表以更类似于 JSON 的方式解释?

标签: jsonelasticsearchflasksqlalchemy

解决方案


推荐阅读