Если основной критерий поиска соответствует show answer that has three or more of the search terms as tags
, тогда это будет немного сложно реализовать с помощью Postgres.
Есть несколько маршрутов вы могли бы пойти, ни один из которых исполнят так же быстро, как запрос Elasticsearch:
SQL подчиненный запрос на в AnswerTags таблице:
Что-то вроде:
SELECT answer_id
FROM answer_tags
WHERE tag_text IN (<list of query terms>)
GROUP BY answer_id HAVING COUNT(*) >= 3
ORDER BY COUNT(*) desc
Использовать Postgres-зависимый тип массива, чтобы держать все метки в поле ответа. Написать хранимую процедуру для вычисления тегов пересечения/перекрывание:
Некоторые предлагаемые подходы в этой теме: Postgres - Function to return the intersection of 2 ARRAYs?
Если вы преследуете Elasticsearch в качестве решения, вы будете иметь гораздо более высокую производительность (хотя, если у вас всего 100 записей, это может быть не очень важно) и более простой путь реализации. (См. minimum_should_match parameter associated with the match query type).
Elasticsearch также позволяет намного больше нюанса в ваших согласующих логических и поисковых функций (например,случаи tiebreaking где соответствуют несколько записей, autosuggesting заголовков ответа или метки, синонимы/вытекающим и другие методы текста нормализации)
Упругих недавно приобрели большой Elasticsearch хостинг компании Found.no, которая является хорошим выбором, если вы хотите, чтобы обойти задачи установки/конфигурации для немедленно встаньте и бегите. Они предлагают 14-дневную бесплатную пробную версию, а Found принадлежит Elastic, обновляется быстрее, чем любые другие узлы ES, и включает в себя премиальные плагины с каждым экземпляром кластера.
Спасибо за совет Петра! Я буду пытаться установить Elasticsearch –