2009-10-07 16 views
25

Ich baue eine mehrsprachige Django-Website, und ich verwende django-transmeta für meine Modelldaten Übersetzungen. Jetzt frage ich mich, ob es eine Django-Such-App gibt, die mit mehrsprachigen Modellen funktioniert. Ich habe mit Haystack gespielt und es funktioniert gut für einsprachige Websites, aber ich kann es nicht mit Transmetas Metaklassen arbeiten ...Suche Funktionalität auf mehrsprachige Django-Website

Hat jemand Erfahrung damit? Irgendwelche Hinweise würden geschätzt werden!

prost,

martin

+2

+1 - Interessante Frage. –

+0

+1 - interessante Frage, interessiert an der Antwort – neuro

Antwort

10

Dies ist eher Ausgangspunkt als eine vollständige Lösung, aber ich hoffe, dass es helfen, und dass andere Benutzer können diese Idee verbessern und erreichen eine bessere Lösung.

Mit Heuhaufen zu indizieren eine mehrsprachige Website (django-transmeta oder django-mehrsprachig verwenden) stellen Sie zwei Probleme:

  1. wie der Inhalt Index für alle Sprachen
  2. wie die Abfrage suchen der richtige Index in Abhängigkeit von den ausgewählten Sprachen

1) Index der Inhalt für alle Sprachen

Erstellen Ihnen ein separaten Felder für jede Sprache in jedem Suchindex-Modell, einen gemeinsamen Präfix und den Sprachcode:

text_en = indexes.CharField(model_attr='body_en', document=True) 
text_pt = indexes.CharField(model_attr='body_pt') 

Wenn Sie Ihnen mehrere Felder indizieren möge offensichtlich eine Vorlage verwenden können. Nur einer der Indizes kann document = True haben.

Wenn Sie schnellere Anzeige vorgerenderter http://haystacksearch.org/docs/searchindex_api.html Feld benötigen, sollten Sie eine für jede Sprache erstellen (dh rendered_en, rendered_pt)

2) Abfrage des richtigen Index

Der Standard Heuhaufen Die Methode "auto_query" ist so programmiert, dass sie auf der Anforderung einen Abfrageparameter "q" empfängt und in allen Indexmodellen das Indexfeld "Inhalt" durchsucht, das als Dokument = True markiert ist. Nur einer der Indizes kann document = True haben und ich glaube, dass wir für jedes django-Modell nur einen SearchIndex haben können.

Die einfachste Lösung, die gemeinsame Suchformular verwendet wird, ist eine mehrsprachige SearchQuerySet zu schaffen, der basierend Filter, nicht auf den Inhalt, sondern auf text_ (Text des auf das Suchindex Modell oben verwendete Präfix ist)

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) 

und Ihre Suche URL zu einem Aussichtspunkt, der diese Abfrage Satz verwendet:

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'), 
) 

Jetzt ist Ihre Suche nach der gewählten Sprache bewusst sein sollte.

+0

Wenn Sie Autocomplete-Funktionalität verwenden und eine Ansicht verwenden: def search_autocomplete (Anfrage): sqs = SearchQuerySet(). Autocomplete (content_auto = request.GET.get ('q', '')) [: 5] --------- Wie können wir Ihre Lösung übernehmen? – ratata

+0

Wie wäre: 1. Hinzufügen content_auto_ Indizes in den Suchindex Klasse 'Klasse SearchableIndex (indexes.SearchIndex, indexes.Indexable): content_auto_en = indexes.EdgeNgramField (model_attr = 'text_en') content_auto_ .. .' 2. Machen Sie Ihre Autocomplete-Ansicht auf die Sprache aufmerksam. Mit Djangos Locale Middleware verwenden Sie i18n_patterns; oder übergeben Sie den Sprachcode als Parameter in der Ajax-Anfrage. 3. 'def search_autocomplete (Anfrage): auto_key = "content_auto_% s" % get_language() kwargs = {auto_key: request.GET.get ('q', '')} = sqs SearchQuerySet() .autocomplete (** kwargs) [: 5] ' –

0

Es gibt nur wenige kommerzielle Produkte - zum Beispiel multilingual indexer für Solr oder Lucene der Lage, die Sprache automatisch zu bestimmen.

Ich mag keine kommerziellen Produkte, aber die Idee ist schön und einfach - crawl die Website, bestimmen die Sprache (mit Meta-Tag zum Beispiel) und Index.

So wählen Sie die Suchmaschine und versuchen Sie es zu erweitern, um mehrsprachige Websites zu behandeln.

Gute Frage, lassen Sie uns wissen, wie Sie das gelöst haben.

0

Hier ist eine Lösung.

Verwenden Sie Sphinx. Erstellen Sie einen Index für jedes Gebietsschema. Z.B. Articles-de_us, Articles-es_mx usw.

Wenn Sie die Suchabfrage an die Sphinx-Such-API übergeben, hängen Sie den Gebietsschema-Code an den Indexnamen an.

Hier ist eine Referenz auf how to setup sphinx with django.

0

Vermeiden Sie Sphinx, wenn Sie können, da Sie weniger Abhängigkeiten wollen. Ich verwende django, um multilingua mit Parameter hl = languageCode zB hl = el für Griechisch oder was auch immer 39 Sprachen oder so django mit appengine unterstützt zu erreichen. gae Ingenieure Backend aktualisieren ganz gleich meine Updates, .po-Dateien mit Projekt gettext meine sind languagepack