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

Posted

技术标签:

【中文标题】多语言 django 网站上的搜索功能【英文标题】:search functionality on multi-language django site 【发布时间】:2010-12-04 14:59:48 【问题描述】:

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

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

干杯,

马丁

【问题讨论】:

+1 - 有趣的问题,对答案感兴趣 【参考方案1】:

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

使用 Haystack 索引多语言站点(使用 django-transmeta 或 django-multilingual)您面临两个问题:

    如何为所有的内容建立索引 语言 如何搜索查询 正确的索引取决于 选定的语言

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 字段 更快的显示,您应该为每种语言创建一个(即,render_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)

并将您的搜索 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'),
)

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

【讨论】:

使用自动完成功能并使用视图时: def search_autocomplete(request): sqs = SearchQuerySet().autocomplete(content_auto=request.GET.get('q', ''))[:5 ] --------- 我们如何采用您的解决方案? 怎么样:1. 将 content_auto_ 索引添加到 SearchIndex 类 class SearchableIndex(indexes.SearchIndex, indexes.Indexable): content_auto_en = indexes.EdgeNgramField(model_attr='text_en') content_auto_... 2. 让您的自动完成视图了解语言。使用 Django 的 LocaleMiddleware,使用 i18n_patterns;或将语言代码作为 ajax 请求中的参数传递。 3.def search_autocomplete(request): auto_key = "content_auto_%s" % get_language() kwargs = auto_key: request.GET.get('q', '') sqs = SearchQuerySet().autocomplete(**kwargs)[:5]【参考方案2】:

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

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

【讨论】:

页面不可用,请检查【参考方案3】:

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

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

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

这是个好问题,请告诉我们你是如何解决这个问题的。

【讨论】:

【参考方案4】:

这里有一个解决方案。

使用Sphinx。为每个语言环境创建一个索引。例如。 Articles-en_us、Articles-es_mx 等

当您将搜索查询传递给 sphinx 搜索 api 时,将语言环境代码附加到索引名称。

这是how to setup sphinx with django的参考。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于多语言 django 网站上的搜索功能的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何创建一个多语言网站

多语言网站的 Django 重定向

纸壳CMS可视化建站系统搭建多语言网站

PHP:子域上的多语言网站,没有许多 public_html 副本

如何为真正的多语言网站设置 CodeIgniter?

如何处理 Codeigniter 上的多语言 uri 重定向?