Django MySQL полнотекстовый поиск - PullRequest
19 голосов
/ 12 февраля 2010

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

Допустим, у меня есть следующая модель:

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

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

Ответы [ 5 ]

24 голосов
/ 19 февраля 2010

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

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

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

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

5 голосов
/ 12 февраля 2010

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

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

3 голосов
/ 04 мая 2019

Ответ с ранее самым высоким рейтингом устарел. Начиная с Django 1.10 больше нет поиска по полю search для баз данных MySQL.

Примечания к выпуску для 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)
3 голосов
/ 26 января 2016

Я не знаю, поможет ли это сейчас, но я создал новую библиотеку 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')

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

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

1 голос
/ 13 февраля 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...