You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/05/23 03:37:52 UTC

[james-project] 04/14: JAMES-2764 Migrate mailbox ES to ES6

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b638a96d65fe117194df51e48af1998666143314
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri May 17 17:55:29 2019 +0700

    JAMES-2764 Migrate mailbox ES to ES6
---
 .../james/backends/es/v6/IndexCreationFactory.java |   9 +-
 .../v6/ElasticSearchMailboxConfiguration.java      |   8 +-
 .../v6/MailboxElasticSearchConstants.java          |   8 +-
 .../elasticsearch/v6/MailboxIndexCreationUtil.java |  26 +-
 .../elasticsearch/v6/MailboxMappingFactory.java    | 440 ++++++++++-----------
 .../ElasticSearchListeningMessageSearchIndex.java  |  13 +-
 .../elasticsearch/v6/query/CriterionConverter.java |  15 +-
 .../elasticsearch/v6/query/SortConverter.java      |  26 +-
 .../v6/search/ElasticSearchSearcher.java           |  80 ++--
 9 files changed, 303 insertions(+), 322 deletions(-)

diff --git a/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java b/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java
index 8c281d0..17c51c7 100644
--- a/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java
+++ b/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java
@@ -173,14 +173,15 @@ public class IndexCreationFactory {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(IndexCreationFactory.class);
     private static final String INDEX_ALREADY_EXISTS_EXCEPTION_MESSAGE = "type=resource_already_exists_exception";
-    private static final String CASE_INSENSITIVE = "case_insensitive";
-    private static final String KEEP_MAIL_AND_URL = "keep_mail_and_url";
-    private static final String SNOWBALL_KEEP_MAIL_AND_URL = "snowball_keep_mail_and_token";
-    private static final String ENGLISH_SNOWBALL = "english_snowball";
 
     private final int nbShards;
     private final int nbReplica;
 
+    public static final String CASE_INSENSITIVE = "case_insensitive";
+    public static final String KEEP_MAIL_AND_URL = "keep_mail_and_url";
+    public static final String SNOWBALL_KEEP_MAIL_AND_URL = "snowball_keep_mail_and_token";
+    public static final String ENGLISH_SNOWBALL = "english_snowball";
+
     @Inject
     public IndexCreationFactory(ElasticSearchConfiguration configuration) {
         this.nbShards = configuration.getNbShards();
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/ElasticSearchMailboxConfiguration.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/ElasticSearchMailboxConfiguration.java
index 6ff086c..3bac6b3 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/ElasticSearchMailboxConfiguration.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/ElasticSearchMailboxConfiguration.java
@@ -23,9 +23,9 @@ import java.util.Objects;
 import java.util.Optional;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.james.backends.es.IndexName;
-import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.WriteAliasName;
+import org.apache.james.backends.es.v6.IndexName;
+import org.apache.james.backends.es.v6.ReadAliasName;
+import org.apache.james.backends.es.v6.WriteAliasName;
 import org.apache.james.util.OptionalUtils;
 
 public class ElasticSearchMailboxConfiguration {
@@ -114,7 +114,7 @@ public class ElasticSearchMailboxConfiguration {
     public static final boolean DEFAULT_INDEX_ATTACHMENTS = true;
     public static final int DEFAULT_NB_SHARDS = 5;
     public static final int DEFAULT_NB_REPLICA = 1;
-    public static final int DEFAULT_PORT = 9300;
+    public static final int DEFAULT_PORT = 9200;
     public static final Optional<Integer> DEFAULT_PORT_AS_OPTIONAL = Optional.of(DEFAULT_PORT);
 
     public static final ElasticSearchMailboxConfiguration DEFAULT_CONFIGURATION = builder().build();
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxElasticSearchConstants.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxElasticSearchConstants.java
index 301127e..07a7644 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxElasticSearchConstants.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxElasticSearchConstants.java
@@ -19,10 +19,9 @@
 
 package org.apache.james.mailbox.elasticsearch.v6;
 
-import org.apache.james.backends.es.IndexName;
-import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.TypeName;
-import org.apache.james.backends.es.WriteAliasName;
+import org.apache.james.backends.es.v6.IndexName;
+import org.apache.james.backends.es.v6.ReadAliasName;
+import org.apache.james.backends.es.v6.WriteAliasName;
 
 public interface MailboxElasticSearchConstants {
 
@@ -33,5 +32,4 @@ public interface MailboxElasticSearchConstants {
     WriteAliasName DEFAULT_MAILBOX_WRITE_ALIAS = new WriteAliasName("mailboxWriteAlias");
     ReadAliasName DEFAULT_MAILBOX_READ_ALIAS = new ReadAliasName("mailboxReadAlias");
     IndexName DEFAULT_MAILBOX_INDEX = new IndexName("mailbox_v1");
-    TypeName MESSAGE_TYPE = new TypeName("message");
 }
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxIndexCreationUtil.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxIndexCreationUtil.java
index 4d320e4..8a41671 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxIndexCreationUtil.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxIndexCreationUtil.java
@@ -19,22 +19,23 @@
 
 package org.apache.james.mailbox.elasticsearch.v6;
 
-import org.apache.james.backends.es.ElasticSearchConfiguration;
-import org.apache.james.backends.es.IndexCreationFactory;
-import org.apache.james.backends.es.IndexName;
-import org.apache.james.backends.es.NodeMappingFactory;
-import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.WriteAliasName;
-import org.elasticsearch.client.Client;
+import java.io.IOException;
+
+import org.apache.james.backends.es.v6.ElasticSearchConfiguration;
+import org.apache.james.backends.es.v6.IndexCreationFactory;
+import org.apache.james.backends.es.v6.IndexName;
+import org.apache.james.backends.es.v6.NodeMappingFactory;
+import org.apache.james.backends.es.v6.ReadAliasName;
+import org.apache.james.backends.es.v6.WriteAliasName;
+import org.elasticsearch.client.RestHighLevelClient;
 
 public class MailboxIndexCreationUtil {
 
-    public static Client prepareClient(Client client,
+    public static RestHighLevelClient prepareClient(RestHighLevelClient client,
                                        ReadAliasName readAlias,
                                        WriteAliasName writeAlias,
                                        IndexName indexName,
-                                       ElasticSearchConfiguration configuration) {
-
+                                       ElasticSearchConfiguration configuration) throws IOException {
         return NodeMappingFactory.applyMapping(
             new IndexCreationFactory(configuration)
                 .useIndex(indexName)
@@ -42,15 +43,14 @@ public class MailboxIndexCreationUtil {
                 .addAlias(writeAlias)
                 .createIndexAndAliases(client),
             indexName,
-            MailboxElasticSearchConstants.MESSAGE_TYPE,
             MailboxMappingFactory.getMappingContent());
     }
 
-    public static Client prepareDefaultClient(Client client, ElasticSearchConfiguration configuration) {
+    public static RestHighLevelClient prepareDefaultClient(RestHighLevelClient client, ElasticSearchConfiguration configuration) throws IOException {
         return prepareClient(client,
             MailboxElasticSearchConstants.DEFAULT_MAILBOX_READ_ALIAS,
             MailboxElasticSearchConstants.DEFAULT_MAILBOX_WRITE_ALIAS,
             MailboxElasticSearchConstants.DEFAULT_MAILBOX_INDEX,
-                configuration);
+            configuration);
     }
 }
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxMappingFactory.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxMappingFactory.java
index 2ecd6d3..4021f73 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxMappingFactory.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/MailboxMappingFactory.java
@@ -19,25 +19,24 @@
 
 package org.apache.james.mailbox.elasticsearch.v6;
 
-import static org.apache.james.backends.es.IndexCreationFactory.CASE_INSENSITIVE;
-import static org.apache.james.backends.es.IndexCreationFactory.KEEP_MAIL_AND_URL;
-import static org.apache.james.backends.es.IndexCreationFactory.SNOWBALL_KEEP_MAIL_AND_URL;
-import static org.apache.james.backends.es.NodeMappingFactory.ANALYZER;
-import static org.apache.james.backends.es.NodeMappingFactory.BOOLEAN;
-import static org.apache.james.backends.es.NodeMappingFactory.FIELDS;
-import static org.apache.james.backends.es.NodeMappingFactory.FORMAT;
-import static org.apache.james.backends.es.NodeMappingFactory.IGNORE_ABOVE;
-import static org.apache.james.backends.es.NodeMappingFactory.INDEX;
-import static org.apache.james.backends.es.NodeMappingFactory.LONG;
-import static org.apache.james.backends.es.NodeMappingFactory.NESTED;
-import static org.apache.james.backends.es.NodeMappingFactory.NOT_ANALYZED;
-import static org.apache.james.backends.es.NodeMappingFactory.PROPERTIES;
-import static org.apache.james.backends.es.NodeMappingFactory.RAW;
-import static org.apache.james.backends.es.NodeMappingFactory.SEARCH_ANALYZER;
-import static org.apache.james.backends.es.NodeMappingFactory.SNOWBALL;
-import static org.apache.james.backends.es.NodeMappingFactory.SPLIT_EMAIL;
-import static org.apache.james.backends.es.NodeMappingFactory.STRING;
-import static org.apache.james.backends.es.NodeMappingFactory.TYPE;
+import static org.apache.james.backends.es.v6.IndexCreationFactory.CASE_INSENSITIVE;
+import static org.apache.james.backends.es.v6.IndexCreationFactory.KEEP_MAIL_AND_URL;
+import static org.apache.james.backends.es.v6.IndexCreationFactory.SNOWBALL_KEEP_MAIL_AND_URL;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.ANALYZER;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.BOOLEAN;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.FIELDS;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.FORMAT;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.IGNORE_ABOVE;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.KEYWORD;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.LONG;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.NESTED;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.NORMALIZER;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.PROPERTIES;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.RAW;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.SEARCH_ANALYZER;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.SNOWBALL;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.SPLIT_EMAIL;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.TYPE;
 import static org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants.BCC;
 import static org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants.CC;
 import static org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants.DATE;
@@ -69,290 +68,267 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
 
 import java.io.IOException;
 
-import org.apache.james.backends.es.NodeMappingFactory;
+import org.apache.james.backends.es.v6.NodeMappingFactory;
 import org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants.EMailer;
-import org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants.Property;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 
 public class MailboxMappingFactory {
 
     private static final int MAXIMUM_TERM_LENGTH = 4096;
     private static final String STANDARD = "standard";
+    private static final String STORE = "store";
+    private static final String FIELD_DATA = "fielddata";
+
 
     public static XContentBuilder getMappingContent() {
         try {
             return jsonBuilder()
                 .startObject()
 
-                    .startObject(MailboxElasticSearchConstants.MESSAGE_TYPE.getValue())
-                        .startObject(PROPERTIES)
+                    .startObject(PROPERTIES)
 
-                            .startObject(MESSAGE_ID)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(MESSAGE_ID)
+                            .field(TYPE, KEYWORD)
+                            .field(STORE, true)
+                        .endObject()
 
-                            .startObject(UID)
-                                .field(TYPE, LONG)
-                            .endObject()
+                        .startObject(UID)
+                            .field(TYPE, LONG)
+                            .field(STORE, true)
+                        .endObject()
 
-                            .startObject(MODSEQ)
-                                .field(TYPE, LONG)
-                            .endObject()
+                        .startObject(MODSEQ)
+                            .field(TYPE, LONG)
+                        .endObject()
 
-                            .startObject(SIZE)
-                                .field(TYPE, LONG)
-                            .endObject()
+                        .startObject(SIZE)
+                            .field(TYPE, LONG)
+                        .endObject()
 
-                            .startObject(IS_ANSWERED)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(IS_ANSWERED)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(IS_DELETED)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(IS_DELETED)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(IS_DRAFT)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(IS_DRAFT)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(IS_FLAGGED)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(IS_FLAGGED)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(IS_RECENT)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(IS_RECENT)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(IS_UNREAD)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(IS_UNREAD)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(DATE)
-                                .field(TYPE, NodeMappingFactory.DATE)
-                                .field(FORMAT, "yyyy-MM-dd'T'HH:mm:ssZ")
-                            .endObject()
+                        .startObject(DATE)
+                            .field(TYPE, NodeMappingFactory.DATE)
+                            .field(FORMAT, "yyyy-MM-dd'T'HH:mm:ssZ")
+                        .endObject()
 
-                            .startObject(SENT_DATE)
-                                .field(TYPE, NodeMappingFactory.DATE)
-                                .field(FORMAT, "yyyy-MM-dd'T'HH:mm:ssZ")
-                            .endObject()
+                        .startObject(SENT_DATE)
+                            .field(TYPE, NodeMappingFactory.DATE)
+                            .field(FORMAT, "yyyy-MM-dd'T'HH:mm:ssZ")
+                        .endObject()
 
-                            .startObject(MEDIA_TYPE)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(MEDIA_TYPE)
+                            .field(TYPE, KEYWORD)
+                        .endObject()
 
-                            .startObject(SUBTYPE)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(SUBTYPE)
+                            .field(TYPE, KEYWORD)
+                        .endObject()
 
-                            .startObject(USER_FLAGS)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(USER_FLAGS)
+                            .field(TYPE, KEYWORD)
+                        .endObject()
 
-                            .startObject(FROM)
-                                .field(TYPE, NESTED)
-                                .startObject(PROPERTIES)
-                                    .startObject(EMailer.NAME)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                        .startObject(FROM)
+                            .field(TYPE, NESTED)
+                            .startObject(PROPERTIES)
+                                .startObject(EMailer.NAME)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
-                                    .startObject(EMailer.ADDRESS)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, STANDARD)
-                                        .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                                .endObject()
+                                .startObject(EMailer.ADDRESS)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, STANDARD)
+                                    .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(SUBJECT)
-                                .field(TYPE, STRING)
-                                .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                .startObject(FIELDS)
-                                    .startObject(RAW)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, CASE_INSENSITIVE)
-                                    .endObject()
+                        .startObject(SUBJECT)
+                            .field(TYPE, TEXT)
+                            .field(ANALYZER, KEEP_MAIL_AND_URL)
+                            .startObject(FIELDS)
+                                .startObject(RAW)
+                                    .field(TYPE, KEYWORD)
+                                    .field(NORMALIZER, CASE_INSENSITIVE)
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(TO)
-                                .field(TYPE, NESTED)
-                                .startObject(PROPERTIES)
-                                    .startObject(EMailer.NAME)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                        .startObject(TO)
+                            .field(TYPE, NESTED)
+                            .startObject(PROPERTIES)
+                                .startObject(EMailer.NAME)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
-                                    .startObject(EMailer.ADDRESS)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, STANDARD)
-                                        .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                                .endObject()
+                                .startObject(EMailer.ADDRESS)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, STANDARD)
+                                    .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(CC)
-                                .field(TYPE, NESTED)
-                                .startObject(PROPERTIES)
-                                    .startObject(EMailer.NAME)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                        .startObject(CC)
+                            .field(TYPE, NESTED)
+                            .startObject(PROPERTIES)
+                                .startObject(EMailer.NAME)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
-                                    .startObject(EMailer.ADDRESS)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, STANDARD)
-                                        .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                            .field(TYPE, STRING)
-                                            .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                                .endObject()
+                                .startObject(EMailer.ADDRESS)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, STANDARD)
+                                    .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(BCC)
-                                .field(TYPE, NESTED)
-                                .startObject(PROPERTIES)
-                                    .startObject(EMailer.NAME)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                        .startObject(BCC)
+                            .field(TYPE, NESTED)
+                            .startObject(PROPERTIES)
+                                .startObject(EMailer.NAME)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
-                                    .startObject(EMailer.ADDRESS)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, STANDARD)
-                                        .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
-                                        .startObject(FIELDS)
-                                            .startObject(RAW)
-                                                .field(TYPE, STRING)
-                                                .field(ANALYZER, CASE_INSENSITIVE)
-                                            .endObject()
+                                .endObject()
+                                .startObject(EMailer.ADDRESS)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, STANDARD)
+                                    .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
+                                    .startObject(FIELDS)
+                                        .startObject(RAW)
+                                            .field(TYPE, KEYWORD)
+                                            .field(NORMALIZER, CASE_INSENSITIVE)
                                         .endObject()
                                     .endObject()
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(MAILBOX_ID)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(MAILBOX_ID)
+                            .field(TYPE, KEYWORD)
+                            .field(STORE, true)
+                        .endObject()
 
-                            .startObject(MIME_MESSAGE_ID)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(MIME_MESSAGE_ID)
+                            .field(TYPE, KEYWORD)
+                        .endObject()
 
-                            .startObject(USERS)
-                                .field(TYPE, STRING)
-                                .field(INDEX, NOT_ANALYZED)
-                            .endObject()
+                        .startObject(USERS)
+                            .field(TYPE, KEYWORD)
+                        .endObject()
 
-                            .startObject(PROPERTIES)
-                                .field(TYPE, NESTED)
-                                .startObject(PROPERTIES)
-                                    .startObject(Property.NAMESPACE)
-                                        .field(TYPE, STRING)
-                                        .field(INDEX, NOT_ANALYZED)
-                                    .endObject()
-                                    .startObject(Property.NAME)
-                                        .field(TYPE, STRING)
-                                        .field(INDEX, NOT_ANALYZED)
-                                    .endObject()
-                                    .startObject(Property.VALUE)
-                                        .field(TYPE, STRING)
-                                        .field(INDEX, NOT_ANALYZED)
-                                    .endObject()
+                        .startObject(TEXT_BODY)
+                            .field(TYPE, TEXT)
+                            .field(ANALYZER, KEEP_MAIL_AND_URL)
+                            .startObject(FIELDS)
+                                .startObject(SPLIT_EMAIL)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, STANDARD)
+                                    .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
                                 .endObject()
-                            .endObject()
-
-                            .startObject(TEXT_BODY)
-                                .field(TYPE, STRING)
-                                .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                .startObject(FIELDS)
-                                    .startObject(SPLIT_EMAIL)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, STANDARD)
-                                        .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
-                                    .endObject()
-                                    .startObject(RAW)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, CASE_INSENSITIVE)
-                                        .field(IGNORE_ABOVE, MAXIMUM_TERM_LENGTH)
-                                    .endObject()
+                                .startObject(RAW)
+                                    .field(TYPE, KEYWORD)
+                                    .field(NORMALIZER, CASE_INSENSITIVE)
+                                    .field(IGNORE_ABOVE, MAXIMUM_TERM_LENGTH)
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(HTML_BODY)
-                                .field(TYPE, STRING)
-                                .field(ANALYZER, KEEP_MAIL_AND_URL)
-                                .startObject(FIELDS)
-                                    .startObject(SPLIT_EMAIL)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, STANDARD)
-                                        .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
-                                    .endObject()
-                                    .startObject(RAW)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, CASE_INSENSITIVE)
-                                        .field(IGNORE_ABOVE, MAXIMUM_TERM_LENGTH)
-                                    .endObject()
+                        .startObject(HTML_BODY)
+                            .field(TYPE, TEXT)
+                            .field(ANALYZER, KEEP_MAIL_AND_URL)
+                            .startObject(FIELDS)
+                                .startObject(SPLIT_EMAIL)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, STANDARD)
+                                    .field(SEARCH_ANALYZER, KEEP_MAIL_AND_URL)
+                                .endObject()
+                                .startObject(RAW)
+                                    .field(TYPE, KEYWORD)
+                                    .field(NORMALIZER, CASE_INSENSITIVE)
+                                    .field(IGNORE_ABOVE, MAXIMUM_TERM_LENGTH)
                                 .endObject()
                             .endObject()
+                        .endObject()
 
-                            .startObject(HAS_ATTACHMENT)
-                                .field(TYPE, BOOLEAN)
-                            .endObject()
+                        .startObject(HAS_ATTACHMENT)
+                            .field(TYPE, BOOLEAN)
+                        .endObject()
 
-                            .startObject(TEXT)
-                                .field(TYPE, STRING)
-                                .field(ANALYZER, SNOWBALL_KEEP_MAIL_AND_URL)
-                                .field(IGNORE_ABOVE, MAXIMUM_TERM_LENGTH)
-                                .startObject(FIELDS)
-                                    .startObject(SPLIT_EMAIL)
-                                        .field(TYPE, STRING)
-                                        .field(ANALYZER, SNOWBALL)
-                                        .field(SEARCH_ANALYZER, SNOWBALL_KEEP_MAIL_AND_URL)
-                                    .endObject()
+                        .startObject(TEXT)
+                            .field(TYPE, TEXT)
+                            .field(ANALYZER, SNOWBALL_KEEP_MAIL_AND_URL)
+                            .startObject(FIELDS)
+                                .startObject(SPLIT_EMAIL)
+                                    .field(TYPE, TEXT)
+                                    .field(ANALYZER, SNOWBALL)
+                                    .field(SEARCH_ANALYZER, SNOWBALL_KEEP_MAIL_AND_URL)
                                 .endObject()
                             .endObject()
                         .endObject()
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/events/ElasticSearchListeningMessageSearchIndex.java
index 8ee2204..f86ac35 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/events/ElasticSearchListeningMessageSearchIndex.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.elasticsearch.v6.events;
 
 import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.Iterator;
@@ -29,8 +30,8 @@ import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.james.backends.es.ElasticSearchIndexer;
-import org.apache.james.backends.es.UpdatedRepresentation;
+import org.apache.james.backends.es.v6.ElasticSearchIndexer;
+import org.apache.james.backends.es.v6.UpdatedRepresentation;
 import org.apache.james.mailbox.MailboxManager.MessageCapabilities;
 import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
 import org.apache.james.mailbox.MailboxSession;
@@ -100,7 +101,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     @Override
     public Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
-        Optional<Long> noLimit = Optional.empty();
+        Optional<Integer> noLimit = Optional.empty();
         return searcher
                 .search(ImmutableList.of(mailbox.getMailboxId()), searchQuery, noLimit)
                 .map(SearchResult::getMessageUid)
@@ -126,7 +127,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     }
 
     @Override
-    public void add(MailboxSession session, Mailbox mailbox, MailboxMessage message) throws JsonProcessingException {
+    public void add(MailboxSession session, Mailbox mailbox, MailboxMessage message) throws IOException {
         LOGGER.info("Indexing mailbox {}-{} of user {} on message {}",
             mailbox.getName(),
             mailbox.getMailboxId(),
@@ -152,7 +153,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     }
 
     @Override
-    public void delete(MailboxSession session, Mailbox mailbox, Collection<MessageUid> expungedUids) {
+    public void delete(MailboxSession session, Mailbox mailbox, Collection<MessageUid> expungedUids) throws IOException {
             elasticSearchIndexer.delete(expungedUids.stream()
                 .map(uid ->  indexIdFor(mailbox, uid))
                 .collect(Guavate.toImmutableList()));
@@ -167,7 +168,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     }
 
     @Override
-    public void update(MailboxSession session, Mailbox mailbox, List<UpdatedFlags> updatedFlagsList) {
+    public void update(MailboxSession session, Mailbox mailbox, List<UpdatedFlags> updatedFlagsList) throws IOException {
             elasticSearchIndexer.update(updatedFlagsList.stream()
                 .map(Throwing.<UpdatedFlags, UpdatedRepresentation>function(
                     updatedFlags -> createUpdatedDocumentPartFromUpdatedFlags(mailbox, updatedFlags))
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/CriterionConverter.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/CriterionConverter.java
index 19612cc..7251f27 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/CriterionConverter.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/CriterionConverter.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.elasticsearch.v6.query;
 
-import static org.apache.james.backends.es.NodeMappingFactory.RAW;
-import static org.apache.james.backends.es.NodeMappingFactory.SPLIT_EMAIL;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.RAW;
+import static org.apache.james.backends.es.v6.NodeMappingFactory.SPLIT_EMAIL;
 import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
 import static org.elasticsearch.index.query.QueryBuilders.existsQuery;
 import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.SearchQuery.Criterion;
 import org.apache.james.mailbox.model.SearchQuery.HeaderOperator;
+import org.apache.lucene.search.join.ScoreMode;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
@@ -275,10 +276,12 @@ public class CriterionConverter {
     }
 
     private QueryBuilder manageAddressFields(String headerName, String value) {
-        return nestedQuery(getFieldNameFromHeaderName(headerName), boolQuery()
-            .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.NAME, value))
-            .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.ADDRESS, value))
-            .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.ADDRESS + "." + RAW, value)));
+        return nestedQuery(getFieldNameFromHeaderName(headerName),
+            boolQuery()
+                .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.NAME, value))
+                .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.ADDRESS, value))
+                .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.ADDRESS + "." + RAW, value)),
+            ScoreMode.Avg);
     }
 
     private String getFieldNameFromHeaderName(String headerName) {
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/SortConverter.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/SortConverter.java
index 52a2624..1a29c77 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/SortConverter.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/query/SortConverter.java
@@ -19,22 +19,22 @@
 
 package org.apache.james.mailbox.elasticsearch.v6.query;
 
-import org.apache.james.backends.es.NodeMappingFactory;
+import org.apache.james.backends.es.v6.NodeMappingFactory;
 import org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.elasticsearch.search.sort.FieldSortBuilder;
 import org.elasticsearch.search.sort.SortBuilders;
+import org.elasticsearch.search.sort.SortMode;
 import org.elasticsearch.search.sort.SortOrder;
 
 public class SortConverter {
 
-    private static final String MIN = "min";
     private static final String PATH_SEPARATOR = ".";
 
     public static FieldSortBuilder convertSort(SearchQuery.Sort sort) {
         return getSortClause(sort.getSortClause())
             .order(getOrder(sort))
-            .sortMode(MIN);
+            .sortMode(SortMode.MIN);
     }
 
     private static FieldSortBuilder getSortClause(SearchQuery.Sort.SortClause clause) {
@@ -42,14 +42,14 @@ public class SortConverter {
             case Arrival :
                 return SortBuilders.fieldSort(JsonMessageConstants.DATE);
             case MailboxCc :
-                return SortBuilders.fieldSort(JsonMessageConstants.CC + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS)
-                    .setNestedPath(JsonMessageConstants.CC);
+                return SortBuilders.fieldSort(JsonMessageConstants.CC + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS
+                    + PATH_SEPARATOR + NodeMappingFactory.RAW).setNestedPath(JsonMessageConstants.CC);
             case MailboxFrom :
-                return SortBuilders.fieldSort(JsonMessageConstants.FROM + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS)
-                    .setNestedPath(JsonMessageConstants.FROM);
+                return SortBuilders.fieldSort(JsonMessageConstants.FROM + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS
+                    + PATH_SEPARATOR + NodeMappingFactory.RAW).setNestedPath(JsonMessageConstants.FROM);
             case MailboxTo :
-                return SortBuilders.fieldSort(JsonMessageConstants.TO + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS)
-                    .setNestedPath(JsonMessageConstants.TO);
+                return SortBuilders.fieldSort(JsonMessageConstants.TO + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS
+                    + PATH_SEPARATOR + NodeMappingFactory.RAW).setNestedPath(JsonMessageConstants.TO);
             case BaseSubject :
                 return SortBuilders.fieldSort(JsonMessageConstants.SUBJECT + PATH_SEPARATOR + NodeMappingFactory.RAW);
             case Size :
@@ -59,11 +59,11 @@ public class SortConverter {
             case Uid :
                 return SortBuilders.fieldSort(JsonMessageConstants.UID);
             case DisplayFrom:
-                return SortBuilders.fieldSort(JsonMessageConstants.FROM + PATH_SEPARATOR + JsonMessageConstants.EMailer.NAME + PATH_SEPARATOR + NodeMappingFactory.RAW)
-                    .setNestedPath(JsonMessageConstants.FROM);
+                return SortBuilders.fieldSort(JsonMessageConstants.FROM + PATH_SEPARATOR + JsonMessageConstants.EMailer.NAME
+                    + PATH_SEPARATOR + NodeMappingFactory.RAW).setNestedPath(JsonMessageConstants.FROM);
             case DisplayTo:
-                return SortBuilders.fieldSort(JsonMessageConstants.TO + PATH_SEPARATOR + JsonMessageConstants.EMailer.NAME + PATH_SEPARATOR + NodeMappingFactory.RAW)
-                    .setNestedPath(JsonMessageConstants.TO);
+                return SortBuilders.fieldSort(JsonMessageConstants.TO + PATH_SEPARATOR + JsonMessageConstants.EMailer.NAME
+                    + PATH_SEPARATOR + NodeMappingFactory.RAW).setNestedPath(JsonMessageConstants.TO);
             case Id:
                 return SortBuilders.fieldSort(JsonMessageConstants.MESSAGE_ID);
             default:
diff --git a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/search/ElasticSearchSearcher.java b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/search/ElasticSearchSearcher.java
index 195326e..f527dd4 100644
--- a/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch-v6/src/main/java/org/apache/james/mailbox/elasticsearch/v6/search/ElasticSearchSearcher.java
@@ -19,101 +19,103 @@
 
 package org.apache.james.mailbox.elasticsearch.v6.search;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.james.backends.es.AliasName;
-import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.TypeName;
-import org.apache.james.backends.es.search.ScrollIterable;
+import org.apache.james.backends.es.v6.AliasName;
+import org.apache.james.backends.es.v6.NodeMappingFactory;
+import org.apache.james.backends.es.v6.ReadAliasName;
+import org.apache.james.backends.es.v6.search.ScrollIterable;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.elasticsearch.v6.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.v6.query.QueryConverter;
 import org.apache.james.mailbox.elasticsearch.v6.query.SortConverter;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
-import org.apache.james.util.streams.Iterators;
-import org.elasticsearch.action.search.SearchRequestBuilder;
+import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.client.Client;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.common.document.DocumentField;
 import org.elasticsearch.common.unit.TimeValue;
 import org.elasticsearch.search.SearchHit;
-import org.elasticsearch.search.SearchHitField;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ElasticSearchSearcher {
+import com.google.common.collect.ImmutableList;
 
-    public static final int DEFAULT_SEARCH_SIZE = 100;
+public class ElasticSearchSearcher {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchSearcher.class);
-    private static final TimeValue TIMEOUT = new TimeValue(60000);
+    private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
+    private static final ImmutableList STORED_FIELDS = ImmutableList.of(JsonMessageConstants.MAILBOX_ID,
+        JsonMessageConstants.UID, JsonMessageConstants.MESSAGE_ID);
 
-    private final Client client;
+    private final RestHighLevelClient client;
     private final QueryConverter queryConverter;
     private final int size;
     private final MailboxId.Factory mailboxIdFactory;
     private final MessageId.Factory messageIdFactory;
     private final AliasName aliasName;
-    private final TypeName typeName;
 
-    public ElasticSearchSearcher(Client client, QueryConverter queryConverter, int size,
+    public ElasticSearchSearcher(RestHighLevelClient client, QueryConverter queryConverter, int size,
                                  MailboxId.Factory mailboxIdFactory, MessageId.Factory messageIdFactory,
-                                 ReadAliasName aliasName, TypeName typeName) {
+                                 ReadAliasName aliasName) {
         this.client = client;
         this.queryConverter = queryConverter;
         this.size = size;
         this.mailboxIdFactory = mailboxIdFactory;
         this.messageIdFactory = messageIdFactory;
         this.aliasName = aliasName;
-        this.typeName = typeName;
     }
 
     public Stream<MessageSearchIndex.SearchResult> search(Collection<MailboxId> mailboxIds, SearchQuery query,
-                                                          Optional<Long> limit) throws MailboxException {
-        SearchRequestBuilder searchRequestBuilder = getSearchRequestBuilder(client, mailboxIds, query, limit);
-        Stream<MessageSearchIndex.SearchResult> pairStream = new ScrollIterable(client, searchRequestBuilder).stream()
+                                                          Optional<Integer> limit) {
+        SearchRequest searchRequest = prepareSearch(mailboxIds, query, limit);
+        Stream<MessageSearchIndex.SearchResult> pairStream = new ScrollIterable(client, searchRequest).stream()
             .flatMap(this::transformResponseToUidStream);
 
         return limit.map(pairStream::limit)
             .orElse(pairStream);
     }
 
-    private SearchRequestBuilder getSearchRequestBuilder(Client client, Collection<MailboxId> users,
-                                                         SearchQuery query, Optional<Long> limit) {
-        return query.getSorts()
+    private SearchRequest prepareSearch(Collection<MailboxId> users, SearchQuery query, Optional<Integer> limit) {
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
+            .query(queryConverter.from(users, query))
+            .size(computeRequiredSize(limit))
+            .storedFields(STORED_FIELDS);
+
+        query.getSorts()
             .stream()
-            .reduce(
-                client.prepareSearch(aliasName.getValue())
-                    .setTypes(typeName.getValue())
-                    .setScroll(TIMEOUT)
-                    .addFields(JsonMessageConstants.UID, JsonMessageConstants.MAILBOX_ID, JsonMessageConstants.MESSAGE_ID)
-                    .setQuery(queryConverter.from(users, query))
-                    .setSize(computeRequiredSize(limit)),
-                (searchBuilder, sort) -> searchBuilder.addSort(SortConverter.convertSort(sort)),
-                (partialResult1, partialResult2) -> partialResult1);
+            .map(SortConverter::convertSort)
+            .forEach(searchSourceBuilder::sort);
+
+        return new SearchRequest(aliasName.getValue())
+            .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
+            .scroll(TIMEOUT)
+            .source(searchSourceBuilder);
     }
 
-    private int computeRequiredSize(Optional<Long> limit) {
+    private int computeRequiredSize(Optional<Integer> limit) {
         return limit.map(value -> Math.min(value.intValue(), size))
             .orElse(size);
     }
 
     private Stream<MessageSearchIndex.SearchResult> transformResponseToUidStream(SearchResponse searchResponse) {
-        return Iterators.toStream(searchResponse.getHits().iterator())
+        return Arrays.stream(searchResponse.getHits().getHits())
             .map(this::extractContentFromHit)
             .filter(Optional::isPresent)
             .map(Optional::get);
     }
 
     private Optional<MessageSearchIndex.SearchResult> extractContentFromHit(SearchHit hit) {
-        SearchHitField mailboxId = hit.field(JsonMessageConstants.MAILBOX_ID);
-        SearchHitField uid = hit.field(JsonMessageConstants.UID);
-        Optional<SearchHitField> id = retrieveMessageIdField(hit);
+        DocumentField mailboxId = hit.field(JsonMessageConstants.MAILBOX_ID);
+        DocumentField uid = hit.field(JsonMessageConstants.UID);
+        Optional<DocumentField> id = retrieveMessageIdField(hit);
         if (mailboxId != null && uid != null) {
             Number uidAsNumber = uid.getValue();
             return Optional.of(
@@ -127,8 +129,8 @@ public class ElasticSearchSearcher {
         }
     }
 
-    private Optional<SearchHitField> retrieveMessageIdField(SearchHit hit) {
-        if (hit.fields().keySet().contains(JsonMessageConstants.MESSAGE_ID)) {
+    private Optional<DocumentField> retrieveMessageIdField(SearchHit hit) {
+        if (hit.getFields().keySet().contains(JsonMessageConstants.MESSAGE_ID)) {
             return Optional.ofNullable(hit.field(JsonMessageConstants.MESSAGE_ID));
         } else {
             return Optional.empty();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org