【问题标题】:Trying to get more matches with lucene试图获得更多与 lucene 的匹配
【发布时间】: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”一样收到它。

当标题的单词多于相应的文件时,我也找不到匹配项,例如“所有时代的终结(烈士之火)”与“所有时代的终结”相对。专辑名称也可能发生。

所以,我想知道我应该对我的代码进行哪些改进,以便获得更多匹配。

【问题讨论】:

    标签: java javafx lucene id3


    【解决方案1】:

    所以我最终发现,对标题或专辑使用 PhraseQuery 并不是最好的方法,因为这会导致 lucene 搜索与此类词组完全匹配的词组。

    我最终做的是为标题和专辑的每个单词创建一个 TermQuery,并将所有内容加入一个 BooleanQuery。

    private Query parseQueryForSong(String artist, String title, String album) throws ParseException {
        String[] artistArr = artist.split(" ");
        String[] titleArr = sanitizePhrase(title).split(" ");
        String[] albumArr = sanitizePhrase(album).split(" ");
    
        BooleanQuery.Builder mainQueryBuilder = new BooleanQuery.Builder();
        BooleanQuery.Builder albumQueryBuilder = new BooleanQuery.Builder();
        PhraseQuery artistQuery = new PhraseQuery("artist", artistArr);
    
        for (String titleWord : titleArr) {
            if (!titleWord.isEmpty()) {
                mainQueryBuilder.add(new TermQuery(new Term("title", titleWord)), BooleanClause.Occur.SHOULD);
            }
        }
    
        for (String albumWord : albumArr) {
            if (!albumWord.isEmpty()) {
                albumQueryBuilder.add(new TermQuery(new Term("album", albumWord)), BooleanClause.Occur.SHOULD);
            }
        }
    
        mainQueryBuilder.add(artistQuery, BooleanClause.Occur.MUST);
        mainQueryBuilder.add(albumQueryBuilder.build(), BooleanClause.Occur.MUST);
    
        StandardAnalyzer analyzer = new StandardAnalyzer();
        Query mainQuery = new QueryParser("title", analyzer).parse(mainQueryBuilder.build().toString());
    
        return mainQuery;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2012-06-08
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多