public static List <ResultItem> SearchFragments(Db db, /*Db db_post,*/ Db db_words, string query) { var results = new List <ResultItem>(); var interm = new List <IntermResult>(); int max_step = db.Table <PostFragment>().LastStep(); int step = 50; Stopwatch sp = new Stopwatch(); sp.Start(); for (int i = 0; i <= max_step; i += step) { var res = db.Table <PostFragment>().Search(f => f.Text, query, i, step) .Select(f => new { f.Id, f.Text, f.QuestionId }) .Select(f => new IntermResult { Id = f.Id, Text = f.Text, QuestionId = f.QuestionId }); interm.AddRange(res); if (sp.ElapsedMilliseconds > 1000 || interm.GroupBy(f => f.QuestionId).Count() >= 1000) { break; } } foreach (var inter in interm) { inter.Score += /*5000 +*/ GetFragmentScore(inter.Text, query); } //tfidf var dic = new Dictionary <string, Dictionary <int, short> >(); foreach (var w in query.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) { var d = db_words.Table <WordTfIdfData>().Where(f => f.Word == w).SelectEntity().FirstOrDefault(); if (d == null) { continue; } var data = Utils.TfIdfFromData(d.Data); dic[w] = data.Item1; } foreach (var inter in interm) { foreach (var w in query.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) { if (dic.ContainsKey(w) && dic[w].ContainsKey(inter.Id)) { inter.Score += dic[w][inter.Id]; } } } foreach (var r in interm.GroupBy(f => f.QuestionId).OrderByDescending(f => f.OrderByDescending(z => z.Score).First().Score).Take(5)) { var q = r.OrderByDescending(z => z.Score).First(); var first_id = q.QuestionId; var item = new ResultItem() { Fragment = q.Text, Id = q.QuestionId, Title = db.Table <WholePost>().Where(f => f.Id == first_id).Select(f => new { f.Title }).First().Title, Score = q.Score }; results.Add(item); } if (!results.Any()) { //return SearchLogic.SearchPosts(db_post, db, query); return(SearchLogic.SearchSubQueries(db, db_words, query)); } else { return(results); } }