Ich benutze Java und Lucene, um jedes Lied einer Liste, die ich von einem Dienst mit lokalen Dateien erhalte, zu vergleichen. Womit ich gerade zu kämpfen habe, ist eine Suchanfrage, die mir die größtmögliche Anzahl an Übereinstimmungen pro Song ermöglicht. Wenn ich pro Song mindestens eine passende Datei bekommen könnte, wäre das großartig. DieseVersuche, mehr Übereinstimmungen mit Lucene zu erhalten
ist, was ich habe atm:
public List<String> getMatchesForSong(String artist, String title, String album) throws ParseException, IOException {
StandardAnalyzer analyzer = new StandardAnalyzer();
String defaultQuery = "(title: \"%s\"~2) AND ((artist: \"%s\") OR (album: \"%s\"))";
String searchQuery = String.format(defaultQuery, title, artist, album);
Query query = new QueryParser("title", analyzer).parse(searchQuery);
if (indexWriter == null) {
indexWriter = createIndexWriter(indexDir);
indexSearcher = createIndexSearcher(indexWriter);
}
TopDocs topDocs = indexSearcher.search(query, 20);
if (topDocs.totalHits > 0) {
return parseScoreDocsList(topDocs.scoreDocs);
}
return null;
}
Das funktioniert sehr gut, wenn es keine Widersprüche sind, auch für nicht-englische Zeichen. Aber es bringt mir kein einziges Spiel zurück, wenn ich zum Beispiel ein Lied mit dem Titel "Die Sonne war in meinen Augen: Teil eins" bekomme, aber meine entsprechende Datei trägt den Titel "Die Sonne war in meinen Augen: Teil 1 "oder wenn ich es wie" Pt. 1 "empfange.
Ich bekomme auch keine Treffer, wenn die Titel mehr Wörter haben als die entsprechenden Dateien, wie "Das Ende aller Zeiten (Märtyrerfeuer)" gegen "Das Ende aller Zeiten". Könnte auch für Albennamen passieren.
Also, was ich gerne wissen würde, ist, welche Verbesserungen ich in meinem Code machen sollte, um mehr Übereinstimmungen zu bekommen.