🐛 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.db import database
from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes
from classquiz.socket_server import sio from classquiz.socket_server import sio
from classquiz.helpers import meilisearch_init
settings = settings() settings = settings()
if settings.sentry_dsn: if settings.sentry_dsn:
@@ -33,7 +34,7 @@ async def startup() -> None:
database_ = app.state.database database_ = app.state.database
if not database_.is_connected: if not database_.is_connected:
await database_.connect() await database_.connect()
meilisearch.index(settings.meilisearch_index).update_settings({"sortableAttributes": ["created_at"]}) await meilisearch_init()
@app.on_event("shutdown") @app.on_event("shutdown")
+33
View File
@@ -1,8 +1,13 @@
import asyncio
from classquiz.db.models import Quiz, User from classquiz.db.models import Quiz, User
import xlsxwriter import xlsxwriter
from aiohttp import ClientSession from aiohttp import ClientSession
from io import BytesIO from io import BytesIO
from PIL import Image from PIL import Image
from classquiz.config import meilisearch, settings
settings = settings()
async def get_meili_data(quiz: Quiz) -> dict: async def get_meili_data(quiz: Quiz) -> dict:
@@ -69,3 +74,31 @@ async def generate_spreadsheet(quiz_results: dict, quiz: Quiz) -> BytesIO:
workbook.close() workbook.close()
storage.seek(0) storage.seek(0)
return storage 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")