public SingleSearchResult GetSongInfo(string searchQuery)
        {
            var result = new SingleSearchResult
            {
                ResultCode = ResultCode.Successful
            };

            try
            {
                logger.LogDebug("GetSongInfo start, use search query: {query}", searchQuery);

                var query = Parser.Parse(searchQuery);
                var songs = LucenePool.SearchSongs(musicConfiguration.IndexPath, query, 10);
                result.SongInfos = songs;

                logger.LogDebug("GetSongInfo ended, use search query: {query}, find {Length} results", searchQuery, songs.Length);
            }
            catch (Exception ex)
            {
                result.ResultCode   = ResultCode.Exception;
                result.ExtraMessage = "Error occur";
                logger.LogError(ex, "GetSongInfo Error Occur");
            }

            return(result);
        }
        public BatchSearchResult GetSongInfos(BatchSearchRequest searchRequest)
        {
            var result = new BatchSearchResult
            {
                ResultCode = ResultCode.Successful
            };

            if (searchRequest.SearchRequestItems.Count > Common.Constants.MaxRequestForOneBatch)
            {
                result.ResultCode   = ResultCode.Failed;
                result.ExtraMessage = $"Too many request items, maxinum {Common.Constants.MaxRequestForOneBatch}.";
            }
            else if (searchRequest.SearchRequestItems?.Any() ?? false)
            {
                foreach (var item in searchRequest.SearchRequestItems)
                {
                    var batchItem = new BatchSearchResultItem
                    {
                        ResultCode        = ResultCode.Successful,
                        SearchRequestItem = item
                    };

                    try
                    {
                        logger.LogDebug("{Method} start for {item}", nameof(GetSongInfos), item);

                        var searchStr = GetSearchQueryStr(item);

                        if (!string.IsNullOrWhiteSpace(searchStr))
                        {
                            var query = Parser.Parse(searchStr);
                            var songs = LucenePool.SearchSongs(musicConfiguration.IndexPath, query, 10);
                            batchItem.SongInfos = songs;
                            logger.LogDebug("{Method} ended for {item}, find {count} results.", nameof(GetSongInfos), item, songs.Length);
                        }
                        else
                        {
                            batchItem.ResultCode   = ResultCode.Failed;
                            batchItem.ExtraMessage = "No valid info to generate search query";
                            logger.LogWarning("{Method} ended for no valid search information", nameof(GetSongInfos));
                        }
                    }
                    catch (Exception ex)
                    {
                        batchItem.ResultCode   = ResultCode.Exception;
                        batchItem.ExtraMessage = "Error occur";
                        logger.LogError(ex, "GetSongInfo Error Occur");
                    }

                    result.SearchResults.Add(batchItem);
                }
            }

            return(result);
        }