EZP-23329: Implement search SPI on Elasticsearch

This PR resolves https://jira.ez.no/browse/EZP-23329

For background see [Solr Location Search](https://github.com/ezsystems/ezpublish-kernel/pull/929)  and [Elasticsearch POC](https://github.com/ezsystems/ezpublish-kernel/pull/942) pull requests which mention a few of the issues we got into, and which is the reason why we decided to look into if ElasticSearch's join system could handled this better.

This implements Elasticsearch storage with both Content and Location search.

In order to support Location Search this implementation indexes Locations and Content separately, using two types of documents. Content documents contain Locations and fields (per language) as nested documents, which keeps the data well structured and makes implementation of LocationQuery criterion for Content Search and field search on specific language possible. Location Search does not implement Fulltext and Field criterions and sort clauses, these are the subject for further discussions. Just a few notes here:

#### Field criteria and sort clauses with Location Search

It would be easy to index fields and implement Field criteria and sort clauses for Location Search, only problem with this is that size of the index would increase twofold, possibly even more, depending on the number of multiple Locations per Content.

One approach here is we implement these, together with separate mapping and Mapper implementation that would index required data, and leave the choice of configuring to the user.

#### Fulltext search support with Location Search

Fulltext support would increase the size even more, also having multiple Locations for the Content would mess up scoring. So IMHO we should not support this unless searching for nested documents directly becomes possible in Elasticsearch. With this it would also become possible to get rid of separate indexing of Locations to support Location Search.

#### Deprecated Location sort clauses for Content search

These were recently (see https://github.com/ezsystems/ezpublish-kernel/pull/995) changed to work on the main Location. Therefore these are not ambiguous anymore are implemented here in the same way.

#### Setting up the environment

1. download Elasticsearch from http://www.elasticsearch.org/downloads/
2. copy (or better yet symlink) mappings and `elasticsearch.yml` from `Persistence/Elasticsearch/Resources` to `config`directory in Elasticsearch root dir:
    * `config/elasticsearch.yml`
    * `config/mappings/ezpublish/content.json`
    * `config/mappings/ezpublish/location.json`
3. start elasticsearch by executing `./bin/elasticsearch` from Elasticsearch root dir
4. execute integration tests: `phpunit -c phpunit-integration-legacy-elasticsearch.xml`

If you have problems with this try with `travis-elasticsearch.sh` found in the root dir.

### TODOs

---

- [x] Implement custom field handling.
- [x] Fix scoring for query part of `Query` object. Elasticsearch handles this differently from Solr, so we will probably need to amend visitors to dispatch on query/filter context.
- [x] setup field data analyzer and fix case-sensitivity tests
- [x] Configure mapping (schema).
- [x] Fix couple of sorting failures.
- [x] Implement indexing command.
- [x] Implement missing criteria for both Content and Location search:
  * MatchNone
  * SectionName (should not be indexed as it can change)
  * SectionIdentifier (should not be indexed as it can change)
  * ContentTypeIdentifier (should not be indexed as it can change)
  * ContentTypeGroupId
- [x] Remove ElasticsearchTest and fixtures after moving new tests to SearchServiceTest.
- [x] Create Elasticsearch integration tests fixtures
- [x] Decide what to do with deprecated criteria and sort clauses.
- [x] Squash before merge

### For discussion

---

* Check about handling `FacetBuilder::$name` property.
* Check if deleting subtree should delete Content (6.0?).
* Check about using ContentType and FieldDefinition identifiers in field names. These can change, which requires reindexing of potentially huge number of documents.
* Check about viability of `FULLTEXT` operator for Field criterion
* We have SectionName and SectionIdentifier sort clauses but no corresponding criteria
* Consider scroll support in API or SPI
* Consider adding "available in fulltext search" flag on FieldDefinition

### Followups

---

1. [EZP-23465:](https://jira.ez.no/browse/EZP-23465) Elasticsearch: implement custom field sort (PR: https://github.com/ezsystems/ezpublish-kernel/pull/1044)
1. [EZP-23396:](https://jira.ez.no/browse/EZP-23396) Elasticsearch: Implement Fulltext criterion for Content search
1. [EZP-23397:](https://jira.ez.no/browse/EZP-23397) Elasticsearch: Implement language filters
1. [EZP-23400:](https://jira.ez.no/browse/EZP-23400) Elasticsearch: Implement visiting Criterion\UserMetadata::GROUP target (PR: https://github.com/ezsystems/ezpublish-kernel/pull/1038)
1. [EZP-23402:](https://jira.ez.no/browse/EZP-23402) Elasticsearch: Implement proper error handling
1. [EZP-23405:](https://jira.ez.no/browse/EZP-23405) Elasticsearch: Fix size (limit) parameter for unlimited
1. [EZP-23466:](https://jira.ez.no/browse/EZP-23466) Elasticsearch: implement language analysis
1. [EZP-23471:](https://jira.ez.no/browse/EZP-23471) Elasticsearch: Implement semantic configuration
1. [EZP-23403:](https://jira.ez.no/browse/EZP-23403) Fix implementation of MoveUserGroup slot
1. [EZP-23247:](https://jira.ez.no/browse/EZP-23247) Implement missing Indexable FieldType classes
1. [EZP-23406:](https://jira.ez.no/browse/EZP-23406) Design and implement commit and bulk API
1. [EZP-20463:](https://jira.ez.no/browse/EZP-20463) Extract Search backend into own SPI
1. [EZP-23244:](https://jira.ez.no/browse/EZP-23244) Test integration of indexing Locations and Content
1. [EZP-21794:](https://jira.ez.no/browse/EZP-21794) Implement integration test framework for Search with Field criterion 
1. [EZP-23242:](https://jira.ez.no/browse/EZP-23242) UserService uses Content search instead of Location search