First is more complex. After Elasticsearch is good at finding related text to a given text, I would use our collective.elastic.plone and configure an elastic proxy index or write a viewlet or tile to directly query Elasticsearch.
In general, you would need to track the reading behavior of the others for finding really related articles...not trivial.
Also finding related content through fulltext search is usually a poor approach. Automatic classification of content, term extraction, AI....are the better approaches here.
I excluded this option in my solution. The problem is, once you analyze the reading behavior, you need a starting point, so one can dice or take different pathways, like sketched above. Once you show related articles people start reading them. So you'll amplify your first decision. Older articles get more reads than new ones, so even if you take the number of reads into account it gets biased. So one need to progressively down vote older ones, or takes reads by day or whatever metric may match. It is not complete impossible to get this right, but it is an expensive task for a questionable feature.
Thanks @jensens, I hadn't thought of this. This is slightly off topic but today I received this request: "We want our users to be able to sort the News folder on the date published, alphabetically or popularity". I was thinking of writing an adapter that gets page views from google analytics but you are correct, older items will generally have more views and therefore more "popular". I will need to use view counts for the last day or week.