Django MySQL полнотекстовый поиск
Мне нужно реализовать полнотекстовый поиск для моего приложения Django, использующего MySQL в качестве бэкэнда.
Допустим, у меня есть модель следующим образом:
class MyItem(models.Model):
title = models.CharField()
short_description = models.TextField()
description = models.TextField()
Я хотел бы получить результаты сначала для вхождений поискового термина в заголовке, затем в short_description и в конце в поле описания. Я буду счастлив, если мне не придется использовать дополнительные модули / приложения для этой задачи.
4 ответа
Ответ с наивысшим рейтингом устарел. Начиная с Django 1.10 больше нет search
поиск по полю для баз данных MySQL (см. раздел поиска в документации 1.10).
Примечания к выпуску для 1.10 также предлагают решение этой проблемы путем определения пользовательского поиска:
поиск запроса
Поисковый поиск, который поддерживает только MySQL и чрезвычайно ограничен в функциях, не рекомендуется. Замените его пользовательским поиском:
from django.db import models class Search(models.Lookup): lookup_name = 'search' def as_mysql(self, compiler, connection): lhs, lhs_params = self.process_lhs(compiler, connection) rhs, rhs_params = self.process_rhs(compiler, connection) params = lhs_params + rhs_params return 'MATCH (%s) AGAINST (%s IN BOOLEAN MODE)' % (lhs, rhs), params models.CharField.register_lookup(Search) models.TextField.register_lookup(Search)
Вы можете использовать полнотекстовый поиск в Django
MyItem.objects.filter(title__search="some search text")
Одна вещь - вы не можете определить полнотекстовый индекс из модели Django, вам нужно сделать это непосредственно в базе данных (используя PHPMyAdmin или SQL-запрос)
Смотрите документацию Django для поиска полей search
Я не знаю, поможет ли это сейчас, но я создал новую библиотеку Python для Django, которая поддерживает встроенный механизм полнотекстового поиска MySQL и MariaDB по одному или нескольким столбцам:
Вы можете взглянуть на это в репозитории GitHub.
Там также есть описание, как установить его, использовать его и как создать FULLTEXT INDEX
вещи через миграции Django (Django 1.7+).
Если вы настроили индексы и задали SearchManager
для вашей модели вы должны иметь возможность запустить что-то вроде:
Mymodel.objects.search('Something')
Mymodel.objects.search('Somet*')
Mymodel.objects.search('+Something -Awesome')
Просто хотел обновить эту тему, потому что я не нашел приемлемого решения до сих пор, и это может помочь кому-то там:)
Приветствия Доми
Если вы ищете мощное решение, я рекомендую http://haystacksearch.org/
Это очень хорошо продумано.
Django предоставляет полнотекстовые функции только для PostgreSQL.
Из документации Django относительно полнотекстового поиска:
Пример:
Entry.objects.filter(headline__search="+Django -jazz Python")
SQL-эквивалент:
SELECT ... WHERE MATCH(tablename, headline) AGAINST (+Django -jazz Python IN BOOLEAN MODE);
Обратите внимание, что это доступно только в MySQL и требует прямого манипулирования базой данных для добавления полнотекстового индекса. По умолчанию Django использует BOOLEAN MODE для полнотекстового поиска. См. Документацию MySQL для получения дополнительной информации.
Теперь о прямом манипулировании базой данных. В MySQL вы можете создать полнотекстовый индекс, выполнив следующие действия ( исходная статья):
- Откройте командную строку и введите
mysql -u root -p
, По запросу введите пароль root. - Войти
use your_db_name
переключиться на вашу базу данных Django. - Войти
CREATE FULLTEXT INDEX index_name ON table_name (column_names)
,
Это оно! Включена индексация FTS в вашей базе данных django. Теперь вы можете использовать богатый API QuerySet в django для полнотекстового поиска.