2010-02-10 29 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。