SQLAlchemy: векторный поиск по ключам столбца JSONB - PullRequest
1 голос
/ 02 апреля 2019

Я использую векторный поиск в моей модели Sqlalchemy.

Таблица выглядит следующим образом:

class MyModel(db.Model):
    title = db.Column(db.String(100))
    description = db.Column(postgresql.JSONB, server_default='{}')
    search_vector = db.Column(TSVectorType('title', 'description', nullable=True)  # created the search vector here

Теперь поиск должен быть основан на 2 полях: 'title' и ' описание '.

Поле 'description' имеет тип JSONB, поэтому я использовал приведенную ниже функцию в моем файле миграции БД для осуществления поиска по этому столбцу -

def upgrade():
    vectorizer.clear()
    conn = op.get_bind()
    register_composites(conn)
    op.add_column('my_model', sa.Column('search_vector', sa.Text, nullable=True), schema='my_schema')
    metadata = MetaData(schema='my_schema')

    @vectorizer(postgresql.JSONB)
    def data_vectorizer(column):
        return sa.cast(column, sa.Text)

    sync_trigger(conn, 'my_model', 'search_vector', ['title', 'description'], metadata=metadata)
    op.create_index(op.f('ix_my_model_search_vector'), 'my_model', ['search_vector'], unique=False,
                schema='my_schema')

Поиск работает нормально.

Проблема:

Значение поля description выглядит примерно так: {'section': 'abc', 'item': 'xyz'}.

Теперь, когда я ищу, я хочу найти запись, если значение section равно 'abc'.Но если я ищу со значением - 'section', то он также показывает запись.Это потому, что значение - {'section': 'abc', 'item': 'xyz'} получает приведение к строке полностью и, следовательно, ключевое слово 'section' также получает поиск, который мне не нужен.

Любое решение, где только abc ищется и не section?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...