示例#1
0
        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);
            }
        }