Elasticsearch: Fix parsing of raw fields result for version 5

Elasticsearch 5 returns the results in a "_source" element rather than
a "fields" element as in Elasticsearch 2.

Add a new method in the adapter and use it in the abstract index.

Bug: Issue 6094
Change-Id: Icc8d6f73f86d8abac798efec178f96c0dbf2ae6f
diff --git a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index 1533d86..b3a22bc 100644
--- a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -190,7 +190,8 @@
   protected FieldBundle toFieldBundle(JsonObject doc) {
     Map<String, FieldDef<V, ?>> allFields = getSchema().getFields();
     ListMultimap<String, Object> rawFields = ArrayListMultimap.create();
-    for (Map.Entry<String, JsonElement> element : doc.get("fields").getAsJsonObject().entrySet()) {
+    for (Map.Entry<String, JsonElement> element :
+        doc.get(client.adapter().rawFieldsKey()).getAsJsonObject().entrySet()) {
       checkArgument(
           allFields.containsKey(element.getKey()), "Unrecognized field " + element.getKey());
       FieldType<?> type = allFields.get(element.getKey()).getType();
diff --git a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
index 72af49a..b6cbf2f 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
@@ -23,6 +23,7 @@
   private final String exactFieldType;
   private final String stringFieldType;
   private final String indexProperty;
+  private final String rawFieldsKey;
 
   ElasticQueryAdapter(ElasticVersion version) {
     this.ignoreUnmapped = version == ElasticVersion.V2_4;
@@ -34,6 +35,7 @@
         this.exactFieldType = "keyword";
         this.stringFieldType = "text";
         this.indexProperty = "true";
+        this.rawFieldsKey = "_source";
         break;
       case V2_4:
       default:
@@ -42,6 +44,7 @@
         this.exactFieldType = "string";
         this.stringFieldType = "string";
         this.indexProperty = "not_analyzed";
+        this.rawFieldsKey = "fields";
         break;
     }
   }
@@ -71,4 +74,8 @@
   String indexProperty() {
     return indexProperty;
   }
+
+  String rawFieldsKey() {
+    return rawFieldsKey;
+  }
 }