Я работаю над реализацией поиска с использованием Flask и Elasticsearch. Все работает локально, приложение работает на Heroku, новые элементы индексируются Heroku Elasticsearch (проверяется с помощью панели управления), но получение результатов не работает на Heroku (но работает с точно таким же кодом локально с тем же набором данных).
Ошибка в журналах Heroku:
File "/app/app/main/routes.py", line 173, in search
if total > page * current_app.config['POSTS_PER_PAGE'] else None
TypeError: '>' not supported between instances of 'dict' and 'int'
Код в маршрутизации вокруг этой строки:
@bp.route('/search')
@login_required
def search():
if not g.search_form.validate():
return redirect(url_for('main.index'))
page = request.args.get('page', 1, type=int)
companies, total = Company.search(g.search_form.q.data, page,
current_app.config['POSTS_PER_PAGE'])
next_url = url_for('main.search', q=g.search_form.q.data, page=page + 1) \
if total > page * current_app.config['POSTS_PER_PAGE'] else None
prev_url = url_for('main.search', q=g.search_form.q.data, page=page - 1) \
if page > 1 else None
return render_template('search.html', title='Search', companies=companies,
next_url=next_url, prev_url=prev_url)
И код в search.py, который доставляет результаты:
def query_index(index, query, page, per_page):
if not current_app.elasticsearch:
return [], 0
search = current_app.elasticsearch.search(
index=index, doc_type=index,
body={'query': {'multi_match': {'query': query, 'fields': ['*']}},
'from': (page - 1) * per_page, 'size': per_page})
ids = [int(hit['_id']) for hit in search['hits']['hits']]
return ids, search['hits']['total']
Сложность в том, что она работает локально, но не в Heroku, я не уверен, почему эта ошибка будет специфичной для Heroku, поскольку при тестировании это тот же набор данных и поисковый запрос.
Если я использую панель инструментов Searchly (Heroku Elasticsearch) для репликации поиска, я получаю ожидаемые результаты.