Running a student forum, I'll share what I did with you.
The general idea was to have primary tags designate the faculty (or Uni) in question and then the primary subtag designate the subject. This was a compromise since it'd be best if we had 1 more level (so then it'd go Institution -> Semester -> Subject). However, one thing I've noticed is that my users don't really feel like tagging stuff past 2 tags: I have secondary tags to designate what kind of activity we're talking about, so ex. Lectures, Laboratory Exercises, Looking For Group etc., yet perhaps half of my users use them, others ignore them at all times.
After 3 months of experience, I think it's optimal to have the following setup:
- primary tags: faculty (ex. faculty of technology, faculty of literature etc.)
- primary subtags: subject (ex. English 101, CS50 etc.)
- secondary tags: activity (ex. homework, practice, exams...) and year/semester/trimester (4th year, 1st semester, 3rd trimester...)
Why this setup? Well, first of, you should separate anything higher than a single Uni into different Flarums. The reason for this is mostly because of your users - they're very different. I'm from a faculty which is itself divided into like 15 departments and 3 different directions - electrical engineering, communication and information technology and computing. Even though the things we're taught overlap there are sometimes big differences between people, even though we all study in the same set of buildings. On the same university, there are irreconcilable differences between faculties: imagine what happens when you mix different unis together... But this doesn't mean they have to be separated - they can interact while on different Flarums, but this would require one to write a "Guest" extension, and this one would likely be a premium extension in the future.
Perhaps the most curious decision is to go directly to subjects as primary subtags. But the reason is simple, really: you don't want primary tags to change. You want them to be strong indicators of what a discussion belongs to. As such, they need to be static. If a subject is removed from the curriculum, then that's that, nothing you can do about it. But what if you take it a semester earlier/later? You don't want small changes like that to affect you, you'll have to change a bunch of existing discussions or introduce more micromanagement to keep track of the new categorization. When you look at how things are structured in an institution, it's mostly to achieve a goal of teaching you something. But the order you are taught is dependent on the institution. Even then, it can change over time. It's not something static, so that is my reasoning why semesters or years aren't a good thing to have as a primary subtag.
However with secondary tags, you have no limits. You can assign secondary tags pretty freely. That's why I keep the type of activity as well as the sequence of subjects there.
Now, I have the same problem as you, and have a "multi-tag filter" extension planned out (to allow filtering by primary + secondary tag, for an example), but I can't get the other important thing I need working: showing followed tags on the Following page. When I get the time I'll create a PR on tags and then you'll be able to filter stuff using a list of clauses in conjunctive normal form, it's high on my priority list, or when someone else gets to do it. Until then you'll have to get by with what you have.
Hope this helps.