slush-marklogic-node icon indicating copy to clipboard operation
slush-marklogic-node copied to clipboard

Splitting facets and results back-end calls

Open grtjn opened this issue 7 years ago • 1 comments

Sometimes facets are big, and thus slow. To not have them slow down showing of results, you can make mlSearch do separate calls for them. It requires adding something like this above ctrl.init() in search.controller.js:

    // override internal search to split results and facets call..
    ctrl._search = function() {
      this.searchPending = true;

      // results only
      var promise = this.mlSearch.search({
        'return-results': true,
        'return-facets': false
      })
      .then(this.updateSearchResults.bind(this));

      // facets only
      this.mlSearch.search({
        'return-results': false,
        'return-facets': true
      })
      .then(this.updateSearchResults.bind(this));

      this.updateURLParams();
      return promise;
    };

    // override the updateSearchResults to handle split of results and facets..
    ctrl.updateSearchResults = function updateSearchResults(data) {
      var oldFacets = ctrl.response.facets;
      var oldResults = ctrl.response.results;

      superCtrl.updateSearchResults.apply(ctrl, arguments);

      if (!ctrl.response.facets) {
        ctrl.response.facets = oldFacets;
      } else {
        ctrl.response.results = oldResults;
      }

      return ctrl;
    };

grtjn avatar Dec 05 '17 08:12 grtjn

Good job. As you found out later, need to add this to ctrl.updateSearchResults, too:


      // forcing caching of results for an "ad-hoc" query
      ctrl.mlSearch.results=ctrl.response;

sashamitrovich avatar Dec 07 '17 13:12 sashamitrovich