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:
- wie der Inhalt Index für alle Sprachen
- 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.
+1 - Interessante Frage. –
+1 - interessante Frage, interessiert an der Antwort – neuro