🐛 Improved MeiliSearch startup

This commit is contained in:
Mawoka
2022-06-12 12:44:21 +02:00
parent 0aa54a7e67
commit 296964ab99
2 changed files with 35 additions and 1 deletions
+2 -1
View File
@@ -8,6 +8,7 @@ from classquiz.config import settings, meilisearch
from classquiz.db import database
from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes
from classquiz.socket_server import sio
from classquiz.helpers import meilisearch_init
settings = settings()
if settings.sentry_dsn:
@@ -33,7 +34,7 @@ async def startup() -> None:
database_ = app.state.database
if not database_.is_connected:
await database_.connect()
meilisearch.index(settings.meilisearch_index).update_settings({"sortableAttributes": ["created_at"]})
await meilisearch_init()
@app.on_event("shutdown")
+33
View File
@@ -1,8 +1,13 @@
import asyncio
from classquiz.db.models import Quiz, User
import xlsxwriter
from aiohttp import ClientSession
from io import BytesIO
from PIL import Image
from classquiz.config import meilisearch, settings
settings = settings()
async def get_meili_data(quiz: Quiz) -> dict:
@@ -69,3 +74,31 @@ async def generate_spreadsheet(quiz_results: dict, quiz: Quiz) -> BytesIO:
workbook.close()
storage.seek(0)
return storage
async def meilisearch_init():
indexes = meilisearch.get_indexes()
classquiz_index_found = False
# +++ Check if the index does not exist and creates it
for index in indexes:
if index.uid == settings.meilisearch_index:
classquiz_index_found = True
if not classquiz_index_found:
print("Creating MeiliSearch Index")
meilisearch.create_index(settings.meilisearch_index)
await asyncio.sleep(1)
# --- END
# +++ Check if count of docs in meilisearch is equal the count in the database +++
quiz_count = await Quiz.objects.filter(public=True).count()
if meilisearch.index(settings.meilisearch_index).get_stats()["numberOfDocuments"] != quiz_count:
print("MeiliSearch and Database got out of sync, syncthing them")
meilisearch.delete_index(settings.meilisearch_index)
meilisearch.create_index(settings.meilisearch_index)
quizzes = await Quiz.objects.filter(public=True).all()
meili_data = []
for quiz in quizzes:
meili_data.append(await get_meili_data(quiz))
meilisearch.index(settings.meilisearch_index).add_documents(meili_data)
# --- END ---
meilisearch.index(settings.meilisearch_index).update_settings({"sortableAttributes": ["created_at"]})
print("Finished MeiliSearch synchronisation")