2009-10-07 9 views
25

Sto costruendo un sito di Django multilingue e sto utilizzando django-transmeta per le mie traduzioni di dati di modello. Ora mi chiedo se esiste un'app di ricerca Django che funziona con modelli multilingue. Ho giocato con Haystack e funziona bene per siti in una sola lingua, ma non riesco a farlo funzionare con metaclasses di transmeta ...funzionalità di ricerca sul sito django multilingue

Qualcuno ha qualche esperienza con questo? Qualsiasi suggerimento sarebbe apprezzato!

applausi,

martin

+2

+1 - Interessante domanda. –

+0

+1 - domanda interessante, interessata alla risposta – neuro

risposta

10

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:

  1. come indicizzare il contenuto per tutti i lingue
  2. 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.

+0

Quando si utilizza la funzionalità di completamento automatico e si utilizza una vista: def search_autocomplete (richiesta): sqs = SearchQuerySet(). Autocomplete (content_auto = request.GET.get ('q', '')) [: 5] --------- Come possiamo adottare la tua soluzione? – ratata

+0

ne dite: 1. Aggiungere content_auto_ <> codice_lingua indici per la classe searchindex classe 'SearchableIndex (indexes.SearchIndex, indexes.Indexable): content_auto_en = indexes.EdgeNgramField (model_attr = 'text_en') content_auto_ .. .' 2. Rendi la tua visualizzazione di autocompletamento consapevole della lingua. Con Django's LocaleMiddleware, usa i18n_patterns; o passare il codice della lingua come parametro nella richiesta Ajax. 3. 'def search_autocomplete (richiesta): auto_key = "content_auto_% s" % get_language() kwargs = {auto_key: request.GET.get ('q', '')} SQS = SearchQuerySet() .autocomplete (** kwargs) [: 5] ' –

0

ci sono pochi prodotti commerciali - ad esempio multilingual indexer per Solr o Lucene in grado di determinare automaticamente la lingua.

Non mi piacciono i prodotti commerciali ma l'idea è carina e semplice: eseguire la scansione del sito Web, determinare la lingua (con il metatag per esempio) e l'indice.

Quindi scegliere il motore di ricerca e provare ad estenderlo per gestire siti multilingue.

Buona domanda, fateci sapere come avete risolto questo.

0

Ecco una soluzione.

Utilizzare Sphinx. Crea un indice per ogni locale. Per esempio. Articoli-en_us, Articoli-es_mx, ecc.

Quando si passa la query di ricerca all'api di ricerca sphinx, aggiungere il codice locale al nome dell'indice.

Ecco un riferimento su how to setup sphinx with django.

0

Evita la sfinge se puoi visto che vorrai meno dipendenze. Io uso django per ottenere multilingua usando il parametro hl = languageCode eg hl = el per greco o qualunque lingua 39 o così django con appengine. Gli ingegneri gae aggiornerà backend non importa i miei aggiornamenti, .po file con il progetto gettext sono i miei languagepack