🐛 Improved MeiliSearch startup
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user