highlightMatchedNodes (searchString) {
    this.searchString = searchString;
    const dimDefault = !!searchString;
    const dimNodes = transform(this.nodes, (result, node) => {
      if (node.isVisible()) {
        result[node.getName()] = dimDefault;
      }
    });

    const dimConnections = transform(this.connections, (result, connection) => {
      if (connection.isVisible()) {
        result[connection.getName()] = dimDefault;
      }
    });

    const matches = {
      total: -1,
      visible: -1
    };

    if (searchString) {
      matches.total = 0;
      matches.visible = 0;

      const nodes = filter(this.nodes, (node) => {
        const matchTargets = [node.getName()];
        if (node.displayName) { matchTargets.push(node.displayName); }

        // Allow to filter results based on services' owner/team defined on metadata object.
        if (node.metadata && node.metadata.owner) { matchTargets.push(node.metadata.owner); }

        if (node.nodes) { Array.prototype.push.apply(matchTargets, node.nodes.map(n => n.name)); }

        const match = (node === this.highlightedObject || matchTargets.join().toLowerCase().indexOf(searchString.toLowerCase()) !== -1);
        if (match) {
          matches.total++;
          if (node.isVisible()) {
            matches.visible++;
          }
        }
        return match;
      });

      each(nodes, (node) => {
        dimNodes[node.getName()] = false;
      });
    }

    this._applyDimming(dimNodes, dimConnections, dimDefault);

    return matches;
  }
Highlight nodes that match the passed in searchString.
Also will match on sub-node names if no match found in the top-level graph.

@param {string} searchString The string to match.
@returns {{total: number, visible: number}} The total matches and the matches that are visible