2009-10-07 9 views
25

Estoy construyendo un sitio 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 hacer que funcione con las metaclases de Transmeta ...funcionalidad de búsqueda en el sitio django en varios idiomas

¿Alguien tiene alguna experiencia con esto? ¡Cualquier indicador sería apreciada!

aplausos,

martin

+2

+1 - Pregunta interesante. –

+0

+1 - pregunta interesante, interesado en la respuesta – neuro

Respuesta

10

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:

  1. cómo indexar el contenido de todos los idiomas
  2. 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.

+0

Al usar la funcionalidad de autocompletar y usar una vista: def search_autocomplete (request): sqs = SearchQuerySet(). Autocomplete (content_auto = request.GET.get ('q', '')) [: 5] --------- ¿Cómo podemos adoptar su solución? ¿Qué hay de – ratata

+0

: 1. Añadir content_auto_ <> LANGUAGE_CODE índices a la clase SearchIndex SearchableIndex clase '(indexes.SearchIndex, indexes.Indexable): content_auto_en = indexes.EdgeNgramField (model_attr = 'text_en') content_auto_ .. .' 2. Haga que su vista de autocompletar tenga conocimiento del idioma. Con LocaleMiddleware de Django, use i18n_patterns; o pasa el código de idioma como un parámetro en la solicitud de ajax. 3. 'def search_autocomplete (request): auto_key = "content_auto_% s" % get_language() kwargs = {auto_key: request.GET.get ('q', '')} SQS = SearchQuerySet() .autocomplete (** kwargs) [: 5] ' –

0

hay pocos productos comerciales - por ejemplo multilingual indexer 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 y trate de extenderlo para manejar sitios multilingües.

Buena pregunta, háganos saber cómo ha resuelto esto.

0

Aquí hay una solución.

Use Sphinx. Crea un índice para cada localidad. P.ej. Artículos-en_us, Artículos-es_mx, etc.

Cuando pasa la consulta de búsqueda a la API de búsqueda de sphinx, añada el código de configuración regional al nombre del índice.

Aquí hay una referencia en how to setup sphinx with django.

0

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. ingenieros gae actualizará backend no importa mis actualizaciones, archivos .po con proyecto gettext son mi languagepack

Cuestiones relacionadas