public List<Product> getBest(BagOfWords query, long queryTime, int k) {
        TreeSet<Comp> set = Sets.newTreeSet();
        for (Indexed<Product> doc : docs.keySet()) {
            double tfIdf = getTfIdf(query, doc);

            if (query.getWords().contains(Tag.also(doc.getKey().getSku()))) {
                tfIdf *= 0;
            }

            long startDate = doc.getKey().getStartDate();
            if (startDate != Product.NO_DATE && !within(queryTime, startDate)) {
                tfIdf *= 0.0;
            }

            set.add(new Comp(tfIdf, doc));
            if (set.size() > k) {
                set.remove(set.last());
            }
        }

        List<Product> result = Lists.newArrayListWithCapacity(k);
        for (Comp min : set) {
            result.add(min.key);
        }

        return result;
    }