Джанго Хейстек: поиск термина с акцентами и без - PullRequest
4 голосов
/ 11 февраля 2010

Я внедряю поисковую систему в свой проект django, используя стог сена 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 }}

Итак, вот какой-то псевдокод, я не знаю, работает ли он, но если у вас есть идеи по этому поводу, дайте мне знать!

Ответы [ 3 ]

3 голосов
/ 14 февраля 2010

Я нахожу способ индексировать оба значения из одного и того же поля в моей модели.

Сначала напишите в вашей модели метод, который возвращает значение ascii для полей:

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

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

Чтобы в вашем шаблоне, который использовался для создания индекса, вы могли сделать это:

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

Тогда вам просто нужно перестроить ваши индексы!

3 голосов
/ 11 февраля 2010

Да, вы на правильном пути. Иногда вы хотите хранить поля несколько раз, применяя различные преобразования.

Примером этого в моем приложении является то, что у меня есть два поля 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" />

Тип "string" отвечает за хранение версии заголовка "как есть".

Кстати, если вы расставляете акценты только для облегчения поиска слов, возможно, стоит обратить на это внимание: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ISOLatin1AccentFilterFactory

0 голосов
/ 28 сентября 2012

Вы должны сделать что-то вроде следующего:

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

Мне не нравится это решение. Я хотел бы знать, как настроить свой серверный бэкэнд, чтобы сделать это для меня. Я использую свист.

...