【问题标题】:Django Haystack : search for a term with and without accentsDjango Haystack:搜索带有和不带有重音符号的术语
【发布时间】:2011-01-15 12:01:36
【问题描述】:

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

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

【问题讨论】:

  • 我不确定,但如果您使用像后端这样的 solr,您可以在查询末尾使用“~”进行查询,这会给您带来模糊的结果,而无需注意口音.
  • 我更喜欢有一个不依赖于后端的解决方案。还是谢谢
  • 我认为您所追求的称为“字符折叠”,虽然根据后端的不同设置不同,但设置非常简单。我在这里解释了如何为 solr 和 whoosh 设置它:gregbrown.co.nz/code/haystack-character-folding

标签: django encoding search-engine django-haystack


【解决方案1】:

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

我的应用程序中的一个例子是我有两个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

【讨论】:

    【解决方案2】:

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

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

    class Car(models.Model):
        name = model.CharField()
    
        def ascii_name(self):
            return strip_accents(self.name)
    

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

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

    然后,您只需重建索引!

    【讨论】:

      【解决方案3】:

      您必须执行以下操作:

      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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 2014-12-29
        • 2015-12-28
        • 2017-09-05
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多