Are you looking to perform this search from within a document? If so, the following seems like it will meet your first two bullet points (I don’t know how vital the third was):
Using the Obsidian Query Language plugin, and the API of that you could do the following dataviewjs query, and get a link to all the files mention your search query.
I’ve set this up to remove files starting with the query, so that a file name “M01L01”, wouldn’t show up in the list. If you want those included, then remove the .filter line.
Similar code should also be possible to do with an execution command of Templater, but this depends whether you want dynamic searching which would refresh itself every time you visit this file, or a static search the first time. If you want dynamic searches, then you could just add this query as is to your template, and change the query to something like const query = "'" + lessonNumber (or whatever you stored your key term in).
You change your mind on what you want all the time, so I resign from trying to help. Sorry, but it is too tiresome trying to read your thoughts on what you really want.