The evolution of computational advertising: from heuristic ad matching to knowledge-based ad retrieval