我正在构建一个多语言Django网站,我正在使用django-transmeta进行模型数据转换。现在我想知道是否有一个适用于多语言模型的Django搜索应用程序。我玩Haystack并且它适用于单语言网站,但我无法使用transmeta的元类...
有没有人有这方面的经验?任何指针都将不胜感激!
欢呼声,
马丁
答案 0 :(得分:10)
这更多的是一个起点而不是一个完整的解决方案,但我希望它能帮到其他用户 可以改善这个想法,并达成更好的解决方案。
使用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字段 更快的显示,您应该为每种语言创建一个(即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 Solr或Lucene能够自动确定语言。
我不喜欢商业产品,但这个想法很简单 - 抓取网站,确定语言(例如带元标记)和索引。
因此,选择搜索引擎并尝试扩展它以处理多语言网站。
很好的问题,让我们知道你是如何解决这个问题的。
答案 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