多语言 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_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]
我在这里写了一个关于如何做的详细解释: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 网站上的搜索功能的主要内容,如果未能解决你的问题,请参考以下文章