Minimum should match

The aim of this pull request is to reduce the number of irrelevant results returned for multi-word searches. At present we frequently observe multi-word searches returning many irrelevant results because results will be returned if they match even just one word of the multi-word query. 

Thankfully elasticsearch offers a feature called minimum_should_match designed to address this. This pull request activates minimum_shoud_match according to the following table:

```
Number of | Minimum
optional  | should
clauses   | match
----------+---------
1         | 1
2         | 2
3         | 2
4         | 3
5         | 3
6         | 3
7         | 3
8+        | 50%
```

The table was devised by myself and @tarastockford using the comparison feature of bin/search with various example queries of different lengths (3, 4, 5, 7, 9 words) and inspecting the consequences on search results. We think that this table should give a good improvement to search performance.

There is one problem with this which is that searches such as 'jobs in birmingham' will only return results which mention both 'jobs' and 'birmingham'. These types of queries are very common and we want the jobsearch to be the top result for such searches. To address this, this PR also includes a 'promoted_results' facility. This is configured in the elasticsearch_schema.yml. It works by adding an additional field called 'promoted_for'. An extra query clause will check if any of the search words match a promoted term and if so that document will be boosted to the top of the results. The only promoted item at present is /jobsearch promoted for the term 'job' (stemmed)

I also did a few refactorings to allow more flexible options to be passed down to the search query builder, and added  features in the bin/search script which allow comparison of different minimum_should_match settings.

UPDATE: I've now added a feature flag to disable this by default in production but allow it to be evaluated in preview.