multi - funcionalidad de búsqueda en el sitio django en varios idiomas
django multi idioma (5)
Estoy construyendo un sitio de Django en varios idiomas, y estoy usando django-transmeta para mis traducciones de datos modelo. Ahora me pregunto si hay una aplicación de búsqueda Django que funcione con modelos en varios idiomas. He jugado con Haystack y funciona bien para sitios de un solo idioma, pero no puedo hacerlo funcionar con las metaclases de Transmeta ...
¿Alguien tiene alguna experiencia con esto? ¡Cualquier indicador sería apreciada!
aclamaciones,
martín
Aquí hay una solución.
Usa Sphinx . Crea un índice para cada localidad. Ej. Artículos-en_us, Artículos-es_mx, etc.
Cuando pase la consulta de búsqueda a la API de búsqueda de sphinx, agregue el código de configuración regional al nombre del índice.
Aquí hay una referencia sobre cómo configurar sphinx con django .
Escribí una explicación detallada sobre cómo hacerlo aquí: http://anthony-tresontani.github.com/Django/2012/09/20/multilingual-search/
Eso implica escribir un motor de solr personalizado (backend + query) y configurar múltiples núcleos por idiomas.
Evita esfinge si puedes, ya que querrás menos dependencias. Yo uso django para lograr multilingua usando el parámetro hl = languageCode por ej. Hl = el para griego o cualquiera de los 39 idiomas o tan django con appengine. Los ingenieros de gae actualizarán el back-end sin importar mis actualizaciones, los archivos .po con el proyecto gettext son mi paquete de idiomas
Existen pocos productos comerciales, por ejemplo, un indexador multilingüe para Solr o Lucene capaz de determinar el idioma automáticamente.
No me gustan los productos comerciales, pero la idea es sencilla: rastrear el sitio web, determinar el idioma (con la metaetiqueta por ejemplo) y el índice.
Así que elija el motor de búsqueda e intente extenderlo para manejar sitios multilingües.
Buena pregunta, déjanos saber cómo resolviste esto.
Esto es más un punto de partida que una solución completa, pero espero que ayude y que otros usuarios puedan mejorar esta idea y alcanzar una mejor solución.
Al usar Haystack para indexar un sitio multilingüe (usando django-transmeta o django-multilingual) se enfrenta a dos problemas:
- cómo indexar el contenido para todos los idiomas
- cómo buscar en la consulta el índice correcto según los idiomas seleccionados
1) Indexe el contenido para todos los idiomas
Cree campos separados para cada idioma en cada modelo de SearchIndex, usando 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 quiere indexar varios campos, obviamente puede usar una plantilla. Solo uno de los índices puede tener document = True.
Si necesita un http://haystacksearch.org/docs/searchindex_api.html campo renderizado previamente para una visualización más rápida, debe crear uno para cada idioma (es decir, rendered_en, rendered_pt)
2) consultar el índice correcto
El método predeterminado de auto_query haystack está programado para recibir un parámetro de consulta "q" en la solicitud y buscar el campo de índice "contenido" - el marcado como document = True - 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 simple, utilizando el formulario de búsqueda común, es crear un SearchQuerySet multilingüe basado en filtros, no en contenido, sino en texto_ (el texto es el prefijo utilizado en el modelo de Searchindex anterior)
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 apunte su URL de búsqueda a una vista que use 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 conocer el idioma seleccionado.