Search code examples
pythondjangoelasticsearchdjango-haystack

Is it possible to have multiple index in haystack elastic using real-time signal for auto-update


I have multiple index in elastic using haystack I am trying to auto-update the index with RealtimeSignalProcessor. Is it supported by Haystack ?

Here is the link I followed . The same thing worked for single index very well.

I suspect the Haystack_connection in settings is something wrong. please suggest the correct syntax.

I don't have any specific need to write any Custom SignalProcessors. Is there a way to use off-the-shelve Haystack Realtime - RealtimeSignalProcessor I referred to this question but was not helpful .

HAYSTACK_CONNECTIONS = {
'default': {
    'ENGINE':        'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
    'URL': 'http://127.0.0.1:9200/',
    'INDEX_NAME': 'haystack',
    'INCLUDE_SPELLING': True,

},
'Hello':
{
    'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
    'URL': 'http://127.0.0.1:9200/',
    'INDEX_NAME': 'helloindex',
    'INCLUDE_SPELLING': True,
},
'Note':
{
    'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
    'URL': 'http://127.0.0.1:9200/',
    'INDEX_NAME': 'noteindex',
    'INCLUDE_SPELLING': True,
}, 
}

Thank-you in advance.


Solution

  • Yes its possible

    I was able to solve this issue by using Django-Haystack's routers

    In settings.py i did this

    HAYSTACK_CONNECTIONS = {
    'My_Testing':
    {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'my_testing',
        'INCLUDE_SPELLING': True,
        'EXCLUDED_INDEXES': ['talks.search_indexes.NoteIndex'],
    
    },
    'Note':
    {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'note',
        'INCLUDE_SPELLING': True,
        'EXCLUDED_INDEXES': ['talks.search_indexes.My_TestingIndex'],
    
    },
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'haystack',
        # 'INCLUDE_SPELLING': True,
    
    },
    }
    
    HAYSTACK_ROUTERS = ['talks.routers.My_TestingRouter',
                    'talks.routers.NoteRouter']
    
    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
    

    and in routers.py file which is at same level as search_indexes.py add this

        from haystack import routers
    
    
    class My_TestingRouter(routers.BaseRouter):
        def for_write(self, **hints):
            return 'My_Testing'
    
        def for_read(self, **hints):
            return 'My_Testing'
    
    
    class NoteRouter(routers.BaseRouter):
        def for_write(self, **hints):
            return 'Note'
    
        def for_read(self, **hints):
            return 'Note'
    

    Hope this helps somebody someday.

    peace.