Este más de un punto de partida que una solución completa, pero espero que ayude y que otros usuarios puede mejorar esta idea y llegar una mejor solución.
Usando Haystack para indexar un sitio multilingüe (usando Django-Transmeta o django-multilingüe) se enfrentan a dos problemas:
- cómo indexar el contenido de todos los idiomas
- cómo buscar la consulta el índice correcto en función de los idiomas seleccionados
1) Índice del contenido para todos los idiomas
Crear una campos separados para cada idioma en todos los modelos SearchIndex, utilizando un prefijo común y el código de idioma:
text_en = indexes.CharField(model_attr='body_en', document=True)
text_pt = indexes.CharField(model_attr='body_pt')
Si desea índice de varios campos, obviamente, se puede utilizar una plantilla. Solo uno de los índices puede tener document = True.
Si necesita pre-renderizados http://haystacksearch.org/docs/searchindex_api.html campo de visualización más rápida, se debe crear una para cada idioma (es decir, rendered_en, rendered_pt)
2) Consultar el índice correcto
El pajar por defecto El método auto_query está programado para recibir un parámetro de consulta "q" en la solicitud y buscar el campo de índice "contenido" - el marcado como documento = Verdadero - en todos los modelos de índice. Solo uno de los índices puede tener document = True y creo que solo podemos tener un SearchIndex para cada modelo django.
La solución más sencilla, utilizando el formulario de búsqueda común, es crear un SearchQuerySet multilingüe que filtros basados, no en el contenido, pero en text_ (texto siendo el prefijo utilizado en el modelo SearchIndex arriba)
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)
y señalar su URL de búsqueda en una vista que utiliza este conjunto de consultas:
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'),
)
Ahora su búsqueda debe ser consciente del idioma seleccionado.
+1 - Pregunta interesante. –
+1 - pregunta interesante, interesado en la respuesta – neuro