在多语言django网站上搜索功能

Hof*_*off 25 django search translation django-models

我正在构建一个多语言Django站点,我正在使用django-transmeta进行模型数据转换.现在我想知道是否有一个适用于多语言模型的Django搜索应用程序.我玩过Haystack,它适用于单语言网站,但我不能让它与transmeta的元类一起工作......

有没有人有这方面的经验?任何指针将不胜感激!

干杯,

马丁

Nun*_*tez 10

这不仅仅是一个完整解决方案的起点,但我希望它有所帮助,其他用户可以改进这个想法并找到更好的解决方案.

使用Haystack索引多语言网站(使用django-transmeta或django-multilingual),您将遇到两个问题:

  1. 如何索引所有语言的内容
  2. 如何根据所选语言在查询中搜索正确的索引

1)索引所有语言的内容

使用公共前缀和语言代码为每个SearchIndex模型中的每种语言创建单独的字段:

text_en = indexes.CharField(model_attr='body_en', document=True)
text_pt = indexes.CharField(model_attr='body_pt')
Run Code Online (Sandbox Code Playgroud)

如果要索引多个字段,显然可以使用模板.只有一个索引可以具有document = True.

如果您需要预先渲染的http://haystacksearch.org/docs/searchindex_api.html字段以便更快地显示,则应为每种语言创建一个(即rendered_en,rendered_pt)

2)查询正确的索引

默认的haystack auto_query方法被编程为在请求上接收"q"查询参数,并在所有Index模型中搜索"content"索引字段 - 标记为document = True的字段.只有一个索引可以有document = True,我相信我们每个django Model只能有一个SearchIndex.

使用通用搜索表单的最简单的解决方案是创建一个多语言SearchQuerySet,它基于内容而不是内容进行过滤,但是基于text_(文本是上面Searchindex模型上使用的前缀)

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)
Run Code Online (Sandbox Code Playgroud)

并将搜索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'),
)
Run Code Online (Sandbox Code Playgroud)

现在,您的搜索应该知道所选语言.