Pertanyaan Django Haystack: cari istilah dengan dan tanpa aksen


Saya mengimplementasikan sistem pencarian ke proyek Django saya, menggunakan tumpukan jerami Django. Masalahnya adalah bahwa beberapa bidang dalam model saya memiliki beberapa aksen perancis, dan saya ingin mencari entri yang berisi permintaan dengan dan tanpa aksen.

Saya pikir Ide terbaik adalah membuat SearchIndex dengan kedua bidang dengan aksen, dan bidang yang sama tanpa aksen.

Ada gagasan atau petunjuk tentang ini?

Ini beberapa kode

Bayangkan model berikut:

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

dan Indeks Haystack berikut:

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)

sekarang, di template indeks saya, saya menempatkan kedua bidang:

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

Jadi, itu beberapa kode palsu, saya tidak tahu apakah itu berfungsi, tetapi jika Anda memiliki ide tentang hal ini, beri tahu saya!


4
2018-02-10 22:41


asal


Jawaban:


Ya, Anda berada di jalur yang benar di sini. Kadang-kadang Anda ingin menyimpan bidang beberapa kali, dengan berbagai transformasi diterapkan.

Contoh ini dalam aplikasi saya adalah bahwa saya memiliki dua title ladang. Satu untuk pencarian yang mendapat stemmed (proses di mana tes ~ = test ~ = tester), dan yang lain untuk menyortir yang dibiarkan saja (stemming mengganggu urutan pengurutan).

Ini adalah kasus yang serupa.

Di schema.xml saya ini ditangani oleh:

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

Jenis "string" bertanggung jawab untuk menyimpan versi "apa adanya" dari judul.

By the way, itu Anda melucuti aksen hanya untuk membuat kata-kata lebih mudah untuk dicari, ini adalah sesuatu yang mungkin layak dilihat: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ISOLatin1AccentFilterFactory


3
2018-02-11 08:08



Saya menemukan cara untuk mengindeks kedua nilai dari bidang yang sama dalam Model saya.

Pertama, tulis metode di model Anda yang mengembalikan nilai ascii bidang:

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

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

Sehingga dalam template Anda yang digunakan untuk menghasilkan indeks, Anda bisa melakukan ini:

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

Kemudian, Anda hanya perlu membangun kembali indeks Anda!


3
2018-02-14 14:05



Anda harus melakukan sesuatu seperti berikut:

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

Saya tidak suka solusi ini. Saya ingin tahu beberapa cara untuk mengkonfigurasi backend pencari saya untuk melakukannya untuk saya. Saya menggunakan whoosh.


0
2017-09-28 15:09