Учитывая достаточно выборочные запросы, ускорение запросов полнотекстового поиска означает наличие надлежащего индекса на месте. jsonb_path_ops
не использовать полнотекстовый поиск:
Класс операторов GIN не по умолчанию jsonb_path_ops
поддерживает индексирование только оператора @>
.
Вместо этого вам нужен (например) функциональный индекс для явного to_tsvector()
:
class Book(Base):
__tablename__ = "book"
id = Column(Integer, primary_key=True)
jsondata = Column(JSONB)
__table_args__ = (
Index('index_jsondesc',
func.to_tsvector('english', jsondata['description'].astext),
postgresql_using="gin"),
)
Обратите внимание, что вы должны выбрать конфигурацию, которая будет использоваться при определении индекса. Ваш запрос должен соответствовать конфигурации, используемой в индексе:
def search(keyword):
tsvector = func.to_tsvector('english', Book.jsondata['description'].astext)
self.query = self.query.filter(tsvector.match(keyword))