Hi,
I think you need to use the 'boosting' functions in DSL for this, and possibly the constant_score_query.
https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-term-query.html <- explains boost
https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-constant-score-query.html
You need to boost the relevance of the documents which match 2 fields so they score more than the docs which match just one.
In your results segment above, the docs matching just one 'allergen' score the same as docs matching 3 ( "_score": 7.0610676,). If you boost the results from the 'match all 3' section by a factor of 100, then the results that match just 2 by a factor of 50, then just 1 match by a factor of 10, then the results should by properly weighted with the more relevant documents appearing first.
Wrapping each compound query in a constant_score_query, will allow you to set the relevance score for all the documents in that query to whatever value you want.
Again all theoretical and untested on my part.
Hope it helps.