Я создаю веб-приложение для поиска людей по их свойствам, таким как образование, опыт и т. Д. Я не могу использовать полнотекстовый поиск по всем полям, потому что некоторые из них должны быть нечеткими. (Например: если мы ищем биотехнологию, она должна выбрать биотехнологию, биотехнологию, а также биотехнологию). Моя база данных содержит около 200 записей в модели профиля, которая должна отображаться в результатах поиска.
Другие модели, такие как образование и опыт, связаны с профилем через внешний ключ
Поэтому я решил быть избирательным в отношении того, какой метод использовать в каком поле. Для более коротких полей, таких как имя степени (в модели образования), я хочу использовать сходство триграмм. Для таких областей, как описание образования, я использую полнотекстовый поиск.
Однако, поскольку я должен сделать это в нескольких полях, я использовал простой поиск вместо использования векторов поиска.
Profile.objects.filter(
Q(first_name__trigram_similar=search_term) |
Q(last_name__trigram_similar=search_term) |
Q(vision_expertise__search=search_term) |
Q(educations__degree__trigram_similar=search_term) |
Q(educations__field_of_study__trigram_similar=search_term) |
Q(educations__school__trigram_similar=search_term) |
Q(educations__description__search=search_term) |
Q(experiences__title__trigram_similar=search_term) |
Q(experiences__company__trigram_similar=search_term) |
Q(experiences__description__search=search_term) |
Q(publications__title__trigram_similar=search_term) |
Q(publications__description__search=search_term) |
Q(certification__certification_name__trigram_similar=search_term) |
Q(certification__certification_authority__trigram_similar=search_term) |
Q(bio_description__search=search_term) |
)
Я получаю ожидаемые результаты при каждом поиске. Однако, время, которое требуется, чтобы получить это смехотворно медленно. Я не могу понять, как сделать это быстрее.