The problem of max-kernel search arises everywhere: given a query point , a set of reference objects and some kernel , find . Max-kernel search is ubiquitous and appears in countless domains of science, thanks to the wide applicability of kernels. A few domains include image matching, information retrieval, bio-informatics, similarity search, and collaborative filtering (to name just a few). However, there is no generalized technique for efficiently solving max-kernel search. This paper presents a single-tree algorithm called single-tree FastMKS which returns the max-kernel solution for a single query point in provably time (where is the number of reference objects), and also a dual-tree algorithm (dual-tree FastMKS) which is useful for max-kernel search with many query points. If the set of query points is of size , this algorithm returns a solution in provably time, which is significantly better than the linear scan solution; these bounds are dependent on the expansion constant of the data. These algorithms work for abstract objects, as they do not require explicit representation of the points in kernel space. Empirical results for a variety of datasets show up to five orders of magnitude speedup in some cases. In addition, we present approximate extensions of the FastMKS algorithms that can achieve further speedups.