【发布时间】:2017-12-16 15:45:41
【问题描述】:
我正在使用 Java 和 lucene 将我从服务收到的列表中的每首歌曲与本地文件进行匹配。我目前正在努力解决的问题是找到一个查询,它可以让我每首歌曲尽可能多地匹配。如果我能在每首歌曲中获得至少一个匹配的文件,那就太好了。
这是我的自动取款机:
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;
}
这在没有不一致的情况下非常有效,即使对于非英文字符也是如此。但它不会返回一个匹配项,例如,如果我收到一首标题为“The Sun Was In My Eyes: Part One”的歌曲,但我对应的文件的标题为“The Sun Was In My Eyes: Part 1” ”,或者如果我像“Pt. 1”一样收到它。
当标题的单词多于相应的文件时,我也找不到匹配项,例如“所有时代的终结(烈士之火)”与“所有时代的终结”相对。专辑名称也可能发生。
所以,我想知道我应该对我的代码进行哪些改进,以便获得更多匹配。
【问题讨论】: