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

时间:2009-10-07 12:51:35

标签: django search django-models translation

我正在构建一个多语言Django网站,我正在使用django-transmeta进行模型数据转换。现在我想知道是否有一个适用于多语言模型的Django搜索应用程序。我玩Haystack并且它适用于单语言网站,但我无法使用transmeta的元类...

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

欢呼声,

马丁

5 个答案:

答案 0 :(得分:10)

这更多的是一个起点而不是一个完整的解决方案,但我希望它能帮到其他用户 可以改善这个想法,并达成更好的解决方案。

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

  1. 如何索引所有内容 语言
  2. 如何搜索查询 正确的索引取决于 选定的语言
  3. 1)索引所有语言的内容

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

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

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

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

    2)查询正确的索引

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

    使用常见搜索表单的最简单的解决方案是创建一个多语言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)
    

    并将搜索网址指向使用此查询集的视图:

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

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

答案 1 :(得分:1)

我在这里写了一个详细的解释:http://anthony-tresontani.github.com/Django/2012/09/20/multilingual-search/

这意味着编写自定义solr引擎(后端+查询)并按语言设置多个核心。

答案 2 :(得分:0)

很少有商业产品 - 例如multilingual indexer SolrLucene能够自动确定语言。

我不喜欢商业产品,但这个想法很简单 - 抓取网站,确定语言(例如带元标记)和索引。

因此,选择搜索引擎并尝试扩展它以处理多语言网站。

很好的问题,让我们知道你是如何解决这个问题的。

答案 3 :(得分:0)

这是一个解决方案。

使用Sphinx。为每个区域设置创建索引。例如。 Articles-en_us,Articles-es_mx等

将搜索查询传递给sphinx搜索API时,请将区域设置代码附加到索引名称。

以下是how to setup sphinx with django的参考资料。

答案 4 :(得分:0)

如果可以,请避免使用sphinx,因为您希望减少依赖关系。我使用django来实现multilingua使用参数hl = languageCode,例如hl = el for greek或者39种语言,或者django和appengine支持。无论我的更新,gae工程师都会更新后端,带有项目gettext的.po文件是我的languagepack