But, the problem that I had was update the search index when the user publishes a django-cms page.
In fact, if you use the HAYSTACK_SIGNAL_PROCESSOR settings, haystack will update your index with the draft copy of the page - both if you save a plugin or a page itself - and it's not a good thing for user experience... and also for our indexes! :-)
Going deep into this issue, I wrote a signal that wraps the RealtimeSignalProcessor and that doesn't break the django-cms publish command if there's no connection to the search engine.
# models.py
# other imports
import logging
# ...
logger = logging.getLogger(__name__)
# ...
def real_time_signal_processor(instance, **kwargs):
from elasticsearch.exceptions import ConnectionError
from django.conf import settings
from haystack import signals
from haystack.utils import loading
connections = loading.ConnectionHandler(settings.HAYSTACK_CONNECTIONS)
connection_router = loading.ConnectionRouter()
if hasattr(settings, 'HAYSTACK_ROUTERS'):
connection_router = loading.ConnectionRouter(settings.HAYSTACK_ROUTERS)
try:
signals.RealtimeSignalProcessor(connections, connection_router).handle_save(kwargs['sender'], instance)
except ConnectionError as e:
logger.error(e.message)
post_publish.connect(real_time_signal_processor)
Just for curiosity, the models.py is a part of the django app named search, where I put all the search engine code (custom backends, forms, etc). I think it's a good practice and nice to have an isolated app that serve to search purposes.
That's it!
Cheers
[Update] The code above catch the exception from elasticsearch client. With a generic exception, you can use that signal with your search backend. IMHO is not a good practice to catch a generic Exception, then use the appropriate one! :-)
Nessun commento:
Posta un commento