2012-06-13 2 views
0

В настоящее время у меня есть база данных курсов, и она имеет 6 столбцов:Реализация поиска в базе данных

class Course(models.Model): 
    title = models.CharField(max_length=50) 
    number = models.CharField(max_length=12) 
    Cat1 = models.BooleanField() 
    Cat2 = models.BooleanField() 
    Cat3 = models.BooleanField() 
    department = models.ForeignKey(Department) 

Метод юникода для этого курса сделан на выходе что-то вроде:

def __unicode__(self): 
     return u'%s %s %s %s %s %s' % (self.department, self.number, self.title, 'CAT1' if self.Cat1 else '','Cat2' if self.Cat2 else '','Cat3' if self.Cat3 else '') 

который возвращает что-то вроде: ENG 1104 Academic Writing Cat1 Cat3

Я пытаюсь выполнить поиск, чтобы найти курсы по текстовым запросам, поэтому я попробовал Haystack (с Whoosh как движок), но чтобы было проще index Я просто добавил новый столбец к модели с именем text, в которой я только что добавил текст Юникода каждого курса. Этот метод работает очень хорошо, но очевидно, что он не является надежным и потому что это всего лишь небольшой проект для меня в целях обучения, я хотел бы знать более эффективные способы выполнения этого поиска. Есть идеи?

+0

вы используете MySQL – shiva

+0

Да, я использую MySql DB – leonsas

+0

U можно попробовать MYSQL полный Tet поиск http://www.mercurytide.co.uk/news/article/django-full-text-search/ – shiva

ответ

1

Haystack не требует изменений в ваших моделях. Рекомендуемый способ заключается в использовании шаблона:

class CourseIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    ... 

Затем создайте файл с именем в виде templates/search/indexes/[app]/[model]_[indexfield].txt. Таким образом, в этом случае это будет templates/search/indexes/yourapp/course_text.txt. Затем вы используете стандартные тег шаблонов Django и такие, чтобы создать простое текстовое представление модели:

{{ object.title }} 
{{ object.number }} 
{{ object.department.name }} 

Добавить столько информации, как вам нравится. Если у вас есть богатые текстовые поля, содержащие HTML, не забудьте использовать striptags, так что вы не получите мусор в своем индексе.

+0

Это будет работать, за исключением полей Cat1,2,3, которые являются булевыми, но при поиске я хочу найти фактическое имя. Могу ли я написать что-то вроде {{'CAT1', если object.Cat1 else ''}} в шаблоне? – leonsas

+1

Конечно, что-то вроде, по крайней мере. Он работает так же, как стандартный шаблон Django, поэтому то, что у вас есть, не будет работать, просто потому, что это недействительный синтаксис для шаблона Django, но '{% if object.Cat1%} CAT1 {% endif%}' будет работать. –

+0

Кроме того, идея состоит в том, чтобы просто добавить любое ключевое слово в шаблон, который вы, возможно, захотите, чтобы люди его нашли. Интервалы, окончания строк и т. Д. Не имеют значения. Это не рассматривается * как стандартный шаблон, а просто вводится в индекс как контент для полнотекстового поиска. –

Смежные вопросы