Searcher: load abbreviated name from YAML, and add functions to sort results by similarity.

master
Jim 3 years ago
parent 7e41eb1105
commit b10f9d3573
  1. 42
      src/main/java/moe/nekojimi/musicsearcher/providers/Searcher.java

@ -6,7 +6,10 @@
package moe.nekojimi.musicsearcher.providers; package moe.nekojimi.musicsearcher.providers;
import com.amihaiemil.eoyaml.YamlMapping; import com.amihaiemil.eoyaml.YamlMapping;
import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinPool;
@ -15,6 +18,7 @@ import java.util.concurrent.TimeoutException;
import moe.nekojimi.musicsearcher.Query; import moe.nekojimi.musicsearcher.Query;
import moe.nekojimi.musicsearcher.QueryFieldUnsupportedException; import moe.nekojimi.musicsearcher.QueryFieldUnsupportedException;
import moe.nekojimi.musicsearcher.Result; import moe.nekojimi.musicsearcher.Result;
import org.apache.commons.lang3.StringUtils;
/** /**
* *
@ -22,18 +26,21 @@ import moe.nekojimi.musicsearcher.Result;
*/ */
public abstract class Searcher public abstract class Searcher
{ {
final String name; protected final String name;
protected String abbr;
private final ForkJoinPool executor; private final ForkJoinPool executor;
public Searcher(String name) public Searcher(String name)
{ {
this.name = name; this.name = name;
this.abbr = name.substring(0, 2);
this.executor = new ForkJoinPool(); this.executor = new ForkJoinPool();
} }
public Searcher(YamlMapping yaml) public Searcher(YamlMapping yaml)
{ {
this(yaml.string("name")); this(yaml.string("name"));
abbr = yaml.string("abbr");
assert yaml.string("type").equals(this.getClass().getSimpleName()); assert yaml.string("type").equals(this.getClass().getSimpleName());
} }
@ -61,10 +68,41 @@ public abstract class Searcher
public CompletableFuture<List<Result>> search(Query query) public CompletableFuture<List<Result>> search(Query query)
{ {
CompletableFuture<List<Result>> future = new CompletableFuture<>(); CompletableFuture<List<Result>> future = new CompletableFuture<>();
future.completeAsync(()->doSearch(query), executor); future.completeAsync(() -> searchWrapper(query), executor);
return future; return future;
} }
protected List<Result> searchWrapper(Query query)
{
List<Result> results = doSearch(query);
for (Result result : results)
{
double artistScore = 1;
double titleScore = 1;
double albumScore = 1;
double fullTextScore = 0;
Set<String> toCompare = new HashSet<>();
toCompare.add(result.getAlbum());
toCompare.add(result.getArtist());
toCompare.add(result.getTitle());
for (String comparison : toCompare)
{
if (comparison == null)
continue;
double score = StringUtils.getJaroWinklerDistance(query.getTextSearch(), comparison);
if (score > fullTextScore)
fullTextScore = score;
}
result.setScore(albumScore * artistScore * titleScore * fullTextScore);
}
Collections.sort(results, Collections.reverseOrder());
return results;
}
protected abstract List<Result> doSearch(Query query) throws QueryFieldUnsupportedException; protected abstract List<Result> doSearch(Query query) throws QueryFieldUnsupportedException;
@Override @Override

Loading…
Cancel
Save