Подтвердить что ты не робот

Полнотекстовый поиск Django MySQL

Мне нужно реализовать полнотекстовый поиск для моего приложения Django, запустив MySQL как бэкэнд.

Скажем, у меня есть модель следующим образом:

class MyItem(models.Model):
    title = models.CharField()
    short_description = models.TextField()
    description = models.TextField()

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

4b9b3361

Ответ 1

Вы можете использовать полнотекстовый поиск в Django

MyItem.objects.filter(title__search="some search text")

Одна вещь - вы не можете определить полнотекстовый индекс из модели Django, вам нужно сделать это непосредственно в базе данных (используя PHPMyAdmin или SQL-запрос)

См. Документацию Django для поиска полей под названием search

Ответ 2

Если вы ищете мягкое решение, я рекомендую http://haystacksearch.org/

Это очень хорошо продумано.

Ответ 3

Я не знаю, помогает ли это сейчас, но я создал новую библиотеку Python для Django, которая поддерживает встроенную полнотекстовую поисковую систему MySQLs и MariaDBs на одном или несколько столбцы

Вы можете посмотреть его на репозитории GitHub

Здесь также описано, как его установить, использовать и как создать материал FULLTEXT INDEX через Django-миграции (Django 1.7 +).

Если вы настроили индексы и задали SearchManager для своей модели, вы можете запустить что-то вроде:

Mymodel.objects.search('Something')
Mymodel.objects.search('Somet*')
Mymodel.objects.search('+Something -Awesome')

Просто хотел обновить эту тему, потому что пока не нашел приемлемого решения, и это могло бы помочь кому-то там:)

Приветствия Доми

Ответ 4

Ответ с наивысшим рейтингом устарел. По Джанго 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)

Ответ 5

Из документации 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. Теперь вы можете использовать богатый django QuerySet API для полнотекстового поиска.