django-haystack: выбор большого SearchIndex вместо индексированной БД

У меня есть модель UserProfile с 35 полями (Char, Int, Bool, Dec, M2M, FK). В рамках функции просмотра поиска одно из полей требует полнотекстового поиска, а остальные 34 поля будут использоваться для обеспечения «расширенной фильтрации поиска» (с использованием: __gte, __ lte, __ Exact, __in, __startswith). «Поисковый» запрос может использовать от 5 до 35 полей в качестве критериев просмотра поиска.

Я использую haystack для создания SearchIndex, и в настоящее время добавлены все 35 полей, но это кажется неэффективным, поскольку я обхожу django ORM (?).

ответ от Фильтровать результаты Django Haystack, такие как QuerySet?, предполагает, что Я мог бы просто сохранить одно поле полнотекстового поиска в SearchIndex и объединить SearchQuerySet с QuerySet django для оставшихся 34 полей фильтра. Мог бы я тогда использовать db_index = True для некоторых или всех этих полей в моей модели django? Будет ли использование этого двухэтапного подхода слияния запросов хорошо масштабироваться для получения тысяч результатов?

Поскольку моя модель UserProfile может вырасти до 300–2 млн записей, я пытаюсь понять, как лучше всего проиндексировать эту модель. Поскольку я новичок в индексировании и поиске в БД, я ищу любые идеи о том, как лучше всего оптимизировать мою базу данных.


person SteveJ    schedule 17.04.2011    source источник


Ответы (1)


Смешивание этих двух, вероятно, не масштабируется. Когда вы создаете набор запросов или SearchQuerySet, запрос фактически не выполняется, пока вы где-нибудь не запросите результат, поэтому они ленивы в этом смысле.

Но если вы сделаете что-то вроде

results = [ r.pk for r in searchqueryset ]

Он фактически выполняет этот запрос к haystack / solr. Если вы просматриваете в общей сложности 2 миллиона записей, это означает, что ваш список потенциально может вернуть 2 миллиона элементов. И теперь вы отправляете 2M-список в MySQL (используя ORM) для дальнейшей фильтрации. Очевидно, что это никогда не будет масштабироваться.

Если вы просто придерживаетесь стога сена, а затем продолжаете создавать свой набор поисковых запросов, он будет выполняться только один раз при доступе к результатам. Также не забывайте уменьшать {{result.object}}, потому что это также попадает в базу данных для каждого результата.

Вы можете посмотреть load_all (), faceting и т. Д.

person Sidmitra    schedule 28.04.2011