Questo più di un punto di partenza di una soluzione completa, ma spero che aiuta e che gli altri utenti può migliorare questa idea e raggiungere una soluzione migliore.
Utilizzando Pagliaio indicizzare un sito multilingue (usando django-Transmeta o django-multilingue) si affrontano due problemi:
- come indicizzare il contenuto per tutti i lingue
- come cercare la query l'indice corretto a seconda delle lingue selezionate
1) indicizzare il contenuto per tutte le lingue
Creare un campi separati per ogni lingua in ogni modello searchindex, utilizzando un prefisso comune e il codice della lingua:
text_en = indexes.CharField(model_attr='body_en', document=True)
text_pt = indexes.CharField(model_attr='body_pt')
Se si desidera indicizzare diversi campi ovviamente è possibile utilizzare un modello. Solo uno degli indici può avere documento = True.
Se avete bisogno di pre-renderizzati http://haystacksearch.org/docs/searchindex_api.html campo per visualizzazione più rapida, si dovrebbe creare uno per ogni lingua (cioè, rendered_en, rendered_pt)
2) Interrogare l'indice corretto
pagliaio di default il metodo auto_query è programmato per ricevere un parametro di query "q" sulla richiesta e cercare nel campo indice "contenuto" - quello contrassegnato come documento = Vero - in tutti i modelli di indice. Solo uno degli indici può avere documento = True e credo che possiamo avere solo un SearchIndex per ogni modello django.
La soluzione più semplice, utilizzando il modulo di ricerca comuni, è quello di creare un SearchQuerySet multilingue che filtra in base, non sul contenuto, ma su testo_ (il testo è il prefisso utilizzato sul modello searchindex sopra)
from django.conf import settings
from django.utils.translation import get_language
from haystack.query import SearchQuerySet, DEFAULT_OPERATOR
class MlSearchQuerySet(SearchQuerySet):
def filter(self, **kwargs):
"""Narrows the search based on certain attributes and the default operator."""
if 'content' in kwargs:
kwd = kwargs.pop('content')
kwdkey = "text_%s" % str(get_language())
kwargs[kwdkey] = kwd
if getattr(settings, 'HAYSTACK_DEFAULT_OPERATOR', DEFAULT_OPERATOR) == 'OR':
return self.filter_or(**kwargs)
else:
return self.filter_and(**kwargs)
e puntare l'URL di ricerca per una vista che utilizza questo set di query:
from haystack.forms import ModelSearchForm
from haystack.views import SearchView
urlpatterns += patterns('haystack.views',
url(r'^search/$', SearchView(
searchqueryset=MlSearchQuerySet(),
form_class=ModelSearchForm
), name='haystack_search_ml'),
)
Ora la ricerca dovrebbe essere a conoscenza della lingua selezionata.
+1 - Interessante domanda. –
+1 - domanda interessante, interessata alla risposta – neuro