4

我正在使用 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 }}

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

4

3 回答 3

4

我找到了一种方法来索引模型中同一字段的两个值。

首先,在您的模型中编写一个方法,该方法返回字段的 ascii 值:

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

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

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

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

然后,您只需要重建索引!

于 2010-02-14T14:05:15.390 回答
3

是的,你在正确的轨道上。有时您确实希望多次存储字段,并应用不同的转换。

我的应用程序中的一个示例是我有两个title字段。一个用于搜索被阻塞的过程(test ~= test ~= tester 的过程),另一个用于单独进行排序(词干干扰了排序顺序)。

这是一个类似的案例。

在我的 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

于 2010-02-11T08:08:28.440 回答
1

您必须执行以下操作:

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

我不喜欢这个解决方案。我想知道一些方法来配置我的搜索后端来为我做这件事。我用嗖嗖声。

于 2012-09-28T15:09:12.057 回答