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 для полнотекстового поиска.

Другие вопросы по тегам