我正在使用django haystack在我的django项目上实现一个搜索系统。问题是我的模型中的某些字段有一些法语口音,我想找到包含和不带重音的查询内容。
我认为最好的想法是使用带有重音符号的字段和没有重音符号的相同字段创建一个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 }}
那么,那是一些伪代码,我不知道它是否有效,但如果您对此有任何想法,请告诉我!
答案 0 :(得分: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" />
“string”类型负责存储标题的“原样”版本。
顺便说一下,你只是为了让单词更易于搜索而剥离重音,这可能是值得研究的: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ISOLatin1AccentFilterFactory
答案 1 :(得分:3)
我找到了一种方法来索引模型中同一字段的两个值。
首先,在模型中编写一个方法,该方法返回字段的ascii值:
class Car(models.Model):
name = model.CharField()
def ascii_name(self):
return strip_accents(self.name)
因此,在用于生成索引的模板中,您可以这样做:
{{ object.name }}
{{ object.ascii_name }}
然后,您只需要重建索引!
答案 2 :(得分: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后端为我做这件事。我用嗖嗖。