Skip to content

Backend-focused web app that serves as a platform for learning & sharing

License

Notifications You must be signed in to change notification settings

flawreen/Collective-Knowledge

Repository files navigation

MVC Stackoverflow web app

Technologies

Collective.Knowledge.Demo.Video.mp4

Alternative Demo Link

Max-heap search engine link

public IQueryable<Discussion> Search(string searchValue)
{
    if (searchValue == null || searchValue.Length == 0)
    {
        return null;
    }
    // regex care ia doar litere si cifre
    var regex = new Regex(@"\W+");
    // lista de keywords
    var keywords = regex.Split(searchValue.ToLower());
    // iau obiectele din baza de date
    var discussions = db.Discussions.Include("Answers").Include("Category");
    // max-heap: cele mai relevante discutii gasite
    var rez = new PriorityQueue<Discussion, int>(Comparer<int>.Create((a, b) => b - a));

    foreach (var discussion in discussions)
    {
        // fac split sa iau doar cuvintele sub forma de lista din titlu, description + raspunsuri
        var allWords = regex.Split(discussion.Title.ToLower()).Union(regex.Split(discussion.Content.ToLower())).ToList();
        foreach (var comm in discussion.Answers)
        {
            allWords.Union(regex.Split(comm.Content.ToLower()));
        }

        // relevanta = cate keyword-uri se regasesc in titlu, descriere si raspunsuri
        int relevance = allWords.Intersect(keywords).Count();
        if (relevance > 0)
        {
            rez.Enqueue(discussion, relevance);  // adaug in max-heap
        }
    }

    // scot in ordine obiectele din max-heap si le incarc intr-o lista
    List<Discussion> res = new List<Discussion>();
    while (rez.TryDequeue(out var obj, out var priority))
    {
        res.Add(obj);
    }

    // nu s-au gasit rezultate
    if (!res.Any())
    {
        return null;
    }

    return res.AsQueryable();
}