diff --git a/assets/js/just-the-docs.js b/assets/js/just-the-docs.js
index ca91555431c284117b4a1929fdd8d764e11384ca..da6c0b0d486e8081b8ce6821e0e390b2ab67a5ff 100644
--- a/assets/js/just-the-docs.js
+++ b/assets/js/just-the-docs.js
@@ -118,6 +118,7 @@ function searchLoaded(index, docs) {
   var searchResults = document.getElementById('search-results');
   var mainHeader = document.getElementById('main-header');
   var currentInput;
+  var currentSearchIndex = 0;
 
   function showSearch() {
     document.documentElement.classList.add('search-active');
@@ -128,6 +129,8 @@ function searchLoaded(index, docs) {
   }
 
   function update() {
+    currentSearchIndex++;
+
     var input = searchInput.value;
     if (input === '') {
       hideSearch();
@@ -180,161 +183,177 @@ function searchLoaded(index, docs) {
       resultsList.classList.add('search-results-list');
       searchResults.appendChild(resultsList);
 
-      for (var i in results) {
-        var result = results[i];
-        var doc = docs[result.ref];
-
-        var resultsListItem = document.createElement('li');
-        resultsListItem.classList.add('search-results-list-item');
-        resultsList.appendChild(resultsListItem);
-
-        var resultLink = document.createElement('a');
-        resultLink.classList.add('search-result');
-        resultLink.setAttribute('href', doc.url);
-        resultsListItem.appendChild(resultLink);
-
-        var resultTitle = document.createElement('div');
-        resultTitle.classList.add('search-result-title');
-        resultLink.appendChild(resultTitle);
-
-        var resultDoc = document.createElement('div');
-        resultDoc.classList.add('search-result-doc');
-        resultDoc.innerHTML = '<svg viewBox="0 0 24 24" class="search-result-icon"><use xlink:href="#svg-doc"></use></svg>';
-        resultTitle.appendChild(resultDoc);
-
-        var resultDocTitle = document.createElement('div');
-        resultDocTitle.classList.add('search-result-doc-title');
-        resultDocTitle.innerHTML = doc.doc;
-        resultDoc.appendChild(resultDocTitle);
-        var resultDocOrSection = resultDocTitle;
-
-        if (doc.doc != doc.title) {
-          resultDoc.classList.add('search-result-doc-parent');
-          var resultSection = document.createElement('div');
-          resultSection.classList.add('search-result-section');
-          resultSection.innerHTML = doc.title;
-          resultTitle.appendChild(resultSection);
-          resultDocOrSection = resultSection;
+      addResults(resultsList, results, 0, 10, 100, currentSearchIndex);
+    }
+
+    function addResults(resultsList, results, start, batchSize, batchMillis, searchIndex) {
+      if (searchIndex != currentSearchIndex) {
+        return;
+      }
+      for (var i = start; i < (start + batchSize); i++) {
+        if (i == results.length) {
+          return;
         }
+        addResult(resultsList, results[i]);
+      }
+      setTimeout(function() {
+        addResults(resultsList, results, start + batchSize, batchSize, batchMillis, searchIndex);
+      }, batchMillis);
+    }
 
-        var metadata = result.matchData.metadata;
-        var titlePositions = [];
-        var contentPositions = [];
-        for (var j in metadata) {
-          var meta = metadata[j];
-          if (meta.title) {
-            var positions = meta.title.position;
-            for (var k in positions) {
-              titlePositions.push(positions[k]);
-            }
+    function addResult(resultsList, result) {
+      var doc = docs[result.ref];
+
+      var resultsListItem = document.createElement('li');
+      resultsListItem.classList.add('search-results-list-item');
+      resultsList.appendChild(resultsListItem);
+
+      var resultLink = document.createElement('a');
+      resultLink.classList.add('search-result');
+      resultLink.setAttribute('href', doc.url);
+      resultsListItem.appendChild(resultLink);
+
+      var resultTitle = document.createElement('div');
+      resultTitle.classList.add('search-result-title');
+      resultLink.appendChild(resultTitle);
+
+      var resultDoc = document.createElement('div');
+      resultDoc.classList.add('search-result-doc');
+      resultDoc.innerHTML = '<svg viewBox="0 0 24 24" class="search-result-icon"><use xlink:href="#svg-doc"></use></svg>';
+      resultTitle.appendChild(resultDoc);
+
+      var resultDocTitle = document.createElement('div');
+      resultDocTitle.classList.add('search-result-doc-title');
+      resultDocTitle.innerHTML = doc.doc;
+      resultDoc.appendChild(resultDocTitle);
+      var resultDocOrSection = resultDocTitle;
+
+      if (doc.doc != doc.title) {
+        resultDoc.classList.add('search-result-doc-parent');
+        var resultSection = document.createElement('div');
+        resultSection.classList.add('search-result-section');
+        resultSection.innerHTML = doc.title;
+        resultTitle.appendChild(resultSection);
+        resultDocOrSection = resultSection;
+      }
+
+      var metadata = result.matchData.metadata;
+      var titlePositions = [];
+      var contentPositions = [];
+      for (var j in metadata) {
+        var meta = metadata[j];
+        if (meta.title) {
+          var positions = meta.title.position;
+          for (var k in positions) {
+            titlePositions.push(positions[k]);
           }
-          if (meta.content) {
-            var positions = meta.content.position;
-            for (var k in positions) {
-              var position = positions[k];
-              var previewStart = position[0];
-              var previewEnd = position[0] + position[1];
-              var ellipsesBefore = true;
-              var ellipsesAfter = true;
-              for (var k = 0; k < {{ site.search.preview_words_before | default: 5 }}; k++) {
-                var nextSpace = doc.content.lastIndexOf(' ', previewStart - 2);
-                var nextDot = doc.content.lastIndexOf('. ', previewStart - 2);
-                if ((nextDot >= 0) && (nextDot > nextSpace)) {
-                  previewStart = nextDot + 1;
-                  ellipsesBefore = false;
-                  break;
-                }
-                if (nextSpace < 0) {
-                  previewStart = 0;
-                  ellipsesBefore = false;
-                  break;
-                }
-                previewStart = nextSpace + 1;
+        }
+        if (meta.content) {
+          var positions = meta.content.position;
+          for (var k in positions) {
+            var position = positions[k];
+            var previewStart = position[0];
+            var previewEnd = position[0] + position[1];
+            var ellipsesBefore = true;
+            var ellipsesAfter = true;
+            for (var k = 0; k < {{ site.search.preview_words_before | default: 5 }}; k++) {
+              var nextSpace = doc.content.lastIndexOf(' ', previewStart - 2);
+              var nextDot = doc.content.lastIndexOf('. ', previewStart - 2);
+              if ((nextDot >= 0) && (nextDot > nextSpace)) {
+                previewStart = nextDot + 1;
+                ellipsesBefore = false;
+                break;
+              }
+              if (nextSpace < 0) {
+                previewStart = 0;
+                ellipsesBefore = false;
+                break;
+              }
+              previewStart = nextSpace + 1;
+            }
+            for (var k = 0; k < {{ site.search.preview_words_after | default: 10 }}; k++) {
+              var nextSpace = doc.content.indexOf(' ', previewEnd + 1);
+              var nextDot = doc.content.indexOf('. ', previewEnd + 1);
+              if ((nextDot >= 0) && (nextDot < nextSpace)) {
+                previewEnd = nextDot;
+                ellipsesAfter = false;
+                break;
               }
-              for (var k = 0; k < {{ site.search.preview_words_after | default: 10 }}; k++) {
-                var nextSpace = doc.content.indexOf(' ', previewEnd + 1);
-                var nextDot = doc.content.indexOf('. ', previewEnd + 1);
-                if ((nextDot >= 0) && (nextDot < nextSpace)) {
-                  previewEnd = nextDot;
-                  ellipsesAfter = false;
-                  break;
-                }
-                if (nextSpace < 0) {
-                  previewEnd = doc.content.length;
-                  ellipsesAfter = false;
-                  break;
-                }
-                previewEnd = nextSpace;
+              if (nextSpace < 0) {
+                previewEnd = doc.content.length;
+                ellipsesAfter = false;
+                break;
               }
-              contentPositions.push({
-                highlight: position,
-                previewStart: previewStart, previewEnd: previewEnd,
-                ellipsesBefore: ellipsesBefore, ellipsesAfter: ellipsesAfter
-              });
+              previewEnd = nextSpace;
             }
+            contentPositions.push({
+              highlight: position,
+              previewStart: previewStart, previewEnd: previewEnd,
+              ellipsesBefore: ellipsesBefore, ellipsesAfter: ellipsesAfter
+            });
           }
         }
+      }
 
-        if (titlePositions.length > 0) {
-          titlePositions.sort(function(p1, p2){ return p1[0] - p2[0] });
-          resultDocOrSection.innerHTML = '';
-          addHighlightedText(resultDocOrSection, doc.title, 0, doc.title.length, titlePositions);
-        }
+      if (titlePositions.length > 0) {
+        titlePositions.sort(function(p1, p2){ return p1[0] - p2[0] });
+        resultDocOrSection.innerHTML = '';
+        addHighlightedText(resultDocOrSection, doc.title, 0, doc.title.length, titlePositions);
+      }
 
-        if (contentPositions.length > 0) {
-          contentPositions.sort(function(p1, p2){ return p1.highlight[0] - p2.highlight[0] });
-          var contentPosition = contentPositions[0];
-          var previewPosition = {
-            highlight: [contentPosition.highlight],
-            previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
-            ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
-          };
-          var previewPositions = [previewPosition];
-          for (var j = 1; j < contentPositions.length; j++) {
-            contentPosition = contentPositions[j];
-            if (previewPosition.previewEnd < contentPosition.previewStart) {
-              previewPosition = {
-                highlight: [contentPosition.highlight],
-                previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
-                ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
-              }
-              previewPositions.push(previewPosition);
-            } else {
-              previewPosition.highlight.push(contentPosition.highlight);
-              previewPosition.previewEnd = contentPosition.previewEnd;
-              previewPosition.ellipsesAfter = contentPosition.ellipsesAfter;
+      if (contentPositions.length > 0) {
+        contentPositions.sort(function(p1, p2){ return p1.highlight[0] - p2.highlight[0] });
+        var contentPosition = contentPositions[0];
+        var previewPosition = {
+          highlight: [contentPosition.highlight],
+          previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
+          ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
+        };
+        var previewPositions = [previewPosition];
+        for (var j = 1; j < contentPositions.length; j++) {
+          contentPosition = contentPositions[j];
+          if (previewPosition.previewEnd < contentPosition.previewStart) {
+            previewPosition = {
+              highlight: [contentPosition.highlight],
+              previewStart: contentPosition.previewStart, previewEnd: contentPosition.previewEnd,
+              ellipsesBefore: contentPosition.ellipsesBefore, ellipsesAfter: contentPosition.ellipsesAfter
             }
+            previewPositions.push(previewPosition);
+          } else {
+            previewPosition.highlight.push(contentPosition.highlight);
+            previewPosition.previewEnd = contentPosition.previewEnd;
+            previewPosition.ellipsesAfter = contentPosition.ellipsesAfter;
           }
+        }
 
-          var resultPreviews = document.createElement('div');
-          resultPreviews.classList.add('search-result-previews');
-          resultLink.appendChild(resultPreviews);
+        var resultPreviews = document.createElement('div');
+        resultPreviews.classList.add('search-result-previews');
+        resultLink.appendChild(resultPreviews);
 
-          var content = doc.content;
-          for (var j = 0; j < Math.min(previewPositions.length, {{ site.search.previews | default: 3 }}); j++) {
-            var position = previewPositions[j];
+        var content = doc.content;
+        for (var j = 0; j < Math.min(previewPositions.length, {{ site.search.previews | default: 3 }}); j++) {
+          var position = previewPositions[j];
 
-            var resultPreview = document.createElement('div');
-            resultPreview.classList.add('search-result-preview');
-            resultPreviews.appendChild(resultPreview);
+          var resultPreview = document.createElement('div');
+          resultPreview.classList.add('search-result-preview');
+          resultPreviews.appendChild(resultPreview);
 
-            if (position.ellipsesBefore) {
-              resultPreview.appendChild(document.createTextNode('... '));
-            }
-            addHighlightedText(resultPreview, content, position.previewStart, position.previewEnd, position.highlight);
-            if (position.ellipsesAfter) {
-              resultPreview.appendChild(document.createTextNode(' ...'));
-            }
+          if (position.ellipsesBefore) {
+            resultPreview.appendChild(document.createTextNode('... '));
+          }
+          addHighlightedText(resultPreview, content, position.previewStart, position.previewEnd, position.highlight);
+          if (position.ellipsesAfter) {
+            resultPreview.appendChild(document.createTextNode(' ...'));
           }
         }
-
-        {%- if site.search.rel_url != false %}
-        var resultRelUrl = document.createElement('span');
-        resultRelUrl.classList.add('search-result-rel-url');
-        resultRelUrl.innerText = doc.relUrl;
-        resultTitle.appendChild(resultRelUrl);
-        {%- endif %}
       }
+
+      {%- if site.search.rel_url != false %}
+      var resultRelUrl = document.createElement('span');
+      resultRelUrl.classList.add('search-result-rel-url');
+      resultRelUrl.innerText = doc.relUrl;
+      resultTitle.appendChild(resultRelUrl);
+      {%- endif %}
     }
 
     function addHighlightedText(parent, text, start, end, positions) {