sclass ScoredSearcher { int maxResults = 1000; LS preparedTerms; new Map scores; *() {} *(S query, O... _) { maxResults = optPar maxResults(_, maxResults); setQuery(query); } void setQuery(S query) { preparedTerms = scoredSearch_prepare(query); } void put(A object, S s) { putUnlessZero(scores, object, scoredSearch_score(s, preparedTerms)); } void put(A object, Collection fields) { putUnlessZero(scores, object, scoreFields(fields)); } int scoreFields(Collection fields) { ret scoredSearch_score(fields, preparedTerms); } int score(S text) { ret scoredSearch_score(text, preparedTerms); } void add(A object) { put(object, str(object)); } void add(A object, Cl fields) { put(object, fields); } L get() { ret takeFirst(maxResults, keysSortedByValuesDesc(scores)); } A best() { ret keyWithHighestValue(scores); } }