Search: Swap in fulltext, allow querying by time range, clamp start_time and limit #2252
Part of #2243.
Who is this PR for?
What problem does this PR fix?
Searching notes didn't work with case mismatches, and didn't do any processing like stemming. It also didn't allow setting the time range, and would let clients query for all data.
What does this PR do?
First, it uses Postgres fulltext operators for matching text instead of LIKE. This includes stemming and filtering stop words. There's no ranking; all results are still time-ordered. I looked at websearch_to_tsquery which would be great but this is new in Postgres 11. It was just released as beta on Heroku, but this requires a database migration so cutting it from this PR.
Second, it allows searching by time range, defaulting to just the school year.
Third, the server clamps the time range that the client sends and the limit that it sends as well.
Screenshot (if adding a client-side feature)
Which features or pages does this PR touch?
Does this PR use tests to help verify we can deploy these changes quickly and confidently?