2009-10-07 20 views
25

私は多言語のDjangoサイトを構築しています。モデルデータの翻訳にはdjango-transmetaを使用しています。今では、多言語モデルで動作するDjango検索アプリケーションがあるかどうか疑問に思っています。私はHaystackと一緒に遊んだことがあり、単言語のサイトではうまく動作しますが、transmetaのメタクラスで動作させることはできません。多言語djangoサイトの検索機能

誰もがこれに関する経験はありますか?任意のポインタが評価されるだろう!

歓声、

マーティン

+2

+1 - 興味深い質問です。 –

+0

+1 - 興味深い質問、回答に興味があります – neuro

答えて

10

あるgettextのプロジェクトとの.poファイルをバックエンドを更新しないだろうが、私はそれが助けを願って、他のユーザー がこのアイデアを改善し、到達できることよりよい解決策です。あなたは二つの問題に直面している(ジャンゴ-Transmetaのか、ジャンゴ・多言語を使用して)インデックスに多言語サイトをヘイスタックを使用して

  1. どの指標すべて 言語のコンテンツをにどのようにクエリを検索
  2. 選択した言語

1に応じて正しいインデックス)ランキングすべての言語のコンテンツ

は共通のプレフィックス と言語コードを使用して、すべてのにSearchIndexモデルにおける言語ごとに個別のフィールドを作成します。

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

あなたは明らかにテンプレートを使用することができ、インデックスいくつかのフィールドにしたい場合。 1つの索引だけがdocument = Trueを持つことができます。

あなたは 速く表示のためのプリレンダリングhttp://haystacksearch.org/docs/searchindex_api.htmlフィールドが必要な場合は、各言語に1つ(すなわち、rendered_en、rendered_pt)

2)正しいインデックス

デフォルトの干し草の山のクエリを作成する必要がありますauto_queryメソッドは、要求「 」に「q」クエリパラメータを受け取り、すべてのインデックスモデルで「コンテンツ」インデックスフィールド(document = Trueとマークされている)を検索するようにプログラムされています。 インデックスのうちの1つだけがdocument = Trueを持つことができ、私はSearchIndexが各djangoモデルに対して しかないと信じています。

共通検索フォームを使用して、最も簡単な解決策は、、、ではないコンテンツに基づいてフィルタリングする多言語SearchQuerySet を作成することであるが、text_に

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) 
(テキストは、上記にSearchIndexモデル に使用されるプレフィックスです)

と、このクエリセットを使用してビューに検索URLを指す:

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

今すぐ検索は、選択した言語を認識する必要があります。

+0

オートコンプリート機能を使用していて、ビューを使用している場合:def search_autocomplete(request): sqs = SearchQuerySet()。autocomplete(content_auto = request.GET.get( 'q'、 '' ' ))[:5] ---------私たちはあなたのソリューションをどのように採用できますか? – ratata

+0

方法について: 1.にSearchIndexクラス 'クラスSearchableIndex(indexes.SearchIndex、indexes.Indexable)にcontent_auto_ インデックスを追加します。 content_auto_en = indexes.EdgeNgramField(model_attr = 'text_en') content_auto_ .. 。' 2.オートコンプリートビューで言語を認識させます。 DjangoのLocaleMiddlewareでは、i18n_patternsを使用します。またはajaxリクエストのパラメータとして言語コードを渡します。 3 'DEF search_autocomplete(リクエスト): auto_key = "content_auto_%sの" %のget_language() kwargsから= {auto_key:request.GET.get( 'Q'、 '')} SQS = SearchQuerySet() .autocomplete(** kwargs)[:5] ' –

0

いくつかの商用製品があります - たとえばmultilingual indexerためSolrや言語を自動的に決定することが可能Luceneため。

私は商用製品が好きではありませんが、アイデアは素敵でシンプルです。ウェブサイトをクロールし、言語(メタタグなど)とインデックスを決定します。

検索エンジンを選択し、それを拡張して多言語サイトを処理してください。

良い質問ですが、これをどのように解決したかお知らせください。

0

ここに解決策があります。

Sphinxを使用してください。各ロケールの索引を作成します。例えば。記事-en_us、記事-es_mxなど

検索クエリをsphinx検索apiに渡すときは、ロケールコードをインデックス名に追加します。

how to setup sphinx with djangoの参考情報です。

0

あなたが依存関係を少なくしたいので、できるだけスフィンクスを避けてください。私はmultilinguaを達成するためにdjangoを使用しています。パラメータhl = languageCode eg hl = el for greekまたはappengineでサポートされている39以上の言語のdjango。 GAEのエンジニアは、関係なく、私の更新を完全なソリューションよりも出発点のこのより私のlanguagepack