Полнотекстовый поиск Django MySQL
Мне нужно реализовать полнотекстовый поиск для моего приложения Django, запустив MySQL как бэкэнд.
Скажем, у меня есть модель следующим образом:
class MyItem(models.Model):
title = models.CharField()
short_description = models.TextField()
description = models.TextField()
Я хотел бы иметь результаты сначала для поиска вхождения в заголовке, затем в short_description и в конце в поле описания. Я буду счастливее, если мне не придется использовать дополнительные модули/приложения для этой задачи.
Ответы
Ответ 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 для полнотекстового поиска.