2010-02-10 32 views
4

我正在使用django haystack在我的django项目上实现搜索系统。问题是我的模型中的某些字段有一些法语口音,我想查找含有和不带重音的查询内容的条目。Django Haystack:搜索带有和没有口音的字词

我认为最好的想法是创建一个带有重音符的字段和没有重音符的相同字段的SearchIndex。

任何想法或提示?

下面是一些代码

想象一下以下机型:

Cars(models.Model): 
    name = models.CharField() 

及以下草堆指数:

Cars(indexes.SearchIndex): 
    name = indexes.CharField(model_attr='name') 
    cleaned_name = indexes.CharField(model_attr='name') 

    def prepare_cleaned_name(self, object): 
     return strip_accents(object.name) 

现在,在我的索引模板,我把两个字段:

{{ object.cleaned_name }} 
{{ object.name }} 

所以,那是一些伪代码,我不知道它是否有效,但如果您对此有任何想法,请告诉我!

+1

我不确定,但是如果您使用的是类似于后端的solr,则可以在查询结尾处使用'〜'进行查询,这会给您提供模糊结果而不考虑口音。 – diegueus9 2010-02-11 02:36:34

+0

我更喜欢有一个不依赖于后端的解决方案。无论如何感谢 – dzen 2010-02-11 10:17:13

+1

我认为你以后称为“字符折叠”,尽管它根据后端具有不同的设置,但设置非常简单。我已经解释了如何为solr和whoosh设置它:http://gregbrown.co.nz/code/haystack-character-folding/ – Greg 2012-12-05 21:27:15

回答

3

我找到一种方法,从指数都相同的值在我的模型领域。

首先,写在你的模型的方法,它返回字段的ASCII值:

class Car(models.Model): 
    name = model.CharField() 

    def ascii_name(self): 
     return strip_accents(self.name) 

因此,在用于生成索引你的模板,你可以这样做:

{{ object.name }} 
{{ object.ascii_name }} 

然后,你只需要重建你的索引!

3

是的,你在这里正确的轨道上。有时候你会想要多次存储字段,并应用不同的转换。

在我的应用程序中的一个例子是,我有两个title字段。一个用于搜索哪​​一个被阻止(测试〜=测试〜=测试者的过程),另一个用于独立排序(阻塞干扰排序顺序)。

这是一个类似的情况。

在我的schema.xml这是由处理:

<field name="title" type="text" indexed="true" stored="true" multiValued="false" /> 
<field name="title_sort" type="string" indexed="true" stored="true" multiValued="false" /> 

类型“串”是负责存储的称号“原样”的版本。

顺便说一句,这你剥口音只是为了话更容易寻找,这是后话,可能是值得探讨: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ISOLatin1AccentFilterFactory

0

你必须做这样的事情如下:

Cars(indexes.SearchIndex): 
    name = indexes.CharField(model_attr='name') 

    def prepare(self, obj): 
     self.prepared_data = super(Cars, self).prepare(obj) 
     self.prepared_data['name'] += '\n' + strip_accents(self.prepared_data['name']) 
     return self.prepared_data 

我不喜欢这样的解决方案。我想知道一些方法来配置我的seach后端为我做。我用whoosh。