Функциональность поиска для Django - PullRequest
2 голосов
/ 31 мая 2009

Я занимаюсь разработкой веб-приложения с использованием Django, и мне нужно скоро добавить функцию поиска. Поиск будет реализован для двух моделей, одна из которых является расширением пользовательского класса auth, а другая - с полями name, tags и description. Так что, думаю, здесь ничего страшного в контексте поиска текста.

Для разработки я использую SQLite , и поскольку никакой работы с базой данных не было сделано, я могу использовать любую базу данных в производстве. Я думаю о выборе между PostgreSQL или MySQL .

Я просмотрел несколько постов в Интернете о поисковых решениях, тем не менее, я хотел бы узнать мнение по моему простому делу. Вот мои вопросы:

  1. является ли полнотекстовый поиск излишним в моем случае?

  2. лучше ли полагаться на поддержку полнотекстового поиска в базе данных? Если да, то какую базу данных мне следует использовать?

  3. я должен использовать внешнюю библиотеку поиска, такую ​​как Whoosh , Sphinx или Xapian ? Если да, то какой?

EDIT: tags - это поле тегов (из приложения django-tagging), которое находится в отношениях m2m. description - это поле, которое содержит HTML и имеет максимальную длину 1024 байта.

Ответы [ 4 ]

5 голосов
/ 31 мая 2009

Если это поле tags означает то, что я думаю, то есть, то есть вы планируете хранить строку, которая объединяет несколько тегов для элемента, тогда вам может потребоваться полнотекстовый поиск по нему ... но это плохой дизайн; скорее, у вас должно быть отношение «многие-многие» между элементами и таблицей тегов (в другой таблице, ItemTag или чем-то еще, с двумя внешними ключами, которые являются первичными ключами таблицы элементов и таблицы тегов).

Я не могу сказать, нужен ли вам полнотекстовый поиск на description, так как у меня нет никаких сведений о том, что это такое, или вам нужен разумный, но несколько элементарный полнотекстовый поиск, который предоставляют MySQL 5.1 и PostgreSQL 8.3 или более мощный, например, в sphinx ... может быть, поговорим немного больше о контексте вашего приложения и почему вы рассматриваете полнотекстовый поиск?

Редактировать: так что, похоже, единственная возможная потребность в полнотекстовом поиске может быть на description, и похоже, что он достаточно ограничен, чтобы либо MySQL 5.1, либо PostgreSQL 8.3 хорошо его обслуживали. У меня есть приятное место для PostgreSQL (хотя я тоже достаточно опытен в MySQL), но это общее предпочтение, не связанное конкретно с проблемами полнотекстового поиска. Этот блог предоставляет одну причину, чтобы предпочесть PostgreSQL: вы можете осуществлять полнотекстовый поиск и при этом выполнять транзакции, тогда как в MySQL полнотекстовая индексация работает только с таблицами MyISAM, а не с InnoDB [[за исключением случаев, когда вы добавляете sphinx , конечно]] (также см. это продолжение , чтобы узнать больше о полнотекстовом поиске в PostgreSQL и Lucene). Тем не менее, есть, конечно, другие соображения, связанные с выбором БД, и я не думаю, что вы будете делать ужасно с любым из них (если только добавление sphinx для полнотекстовых транзакций и транзакций не является большой проблемой).

1 голос
/ 31 мая 2009

Django поддерживает полнотекстовый поиск в своих фильтрах QuerySet. Прямо сейчас, если у вас есть только две модели, которые нуждаются в поиске, просто создайте представление, которое ищет поля в обеих:

search_string = "+Django -jazz Python"
first_models = FirstModel.objects.filter(headline__search=search_string)
second_models = SecondModel.objects.filter(headline__search=search_string)

Вы можете дополнительно отфильтровать их, чтобы убедиться, что результаты уникальны, если это необходимо.

Кроме того, существует фильтр регулярных выражений , который может быть даже лучше для работы с вашими HTML-полями и тегами, поскольку регулярное выражение может указывать фильтру, как именно обрабатывать любые разделители или разметку.

0 голосов
/ 31 мая 2009

Стог сена выглядит многообещающе. И он поддерживает Whoosh на задней панели.

0 голосов
/ 31 мая 2009

Необходимость внешней библиотеки зависит от ваших потребностей. О каком трафике мы говорим? Внешние библиотеки обычно лучше, когда дело касается производительности, но, как всегда, есть свои преимущества и недостатки. Я использую Sphinx с плагином django-sphinx, и я бы порекомендовал его, если вы будете много искать.

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