Ejemplo n.º 1
0
        public IEnumerable <Article> AdvancedSearch(string searchTerm, string[] fields)
        {  //Έλεγχος αν υπάρχει το ευρετήριο αν όχι πέτα το μήνυμα
            if (!System.IO.Directory.Exists(indexPathLead))
            {
                throw new NullReferenceException("Index Does Not Exist");
            }
            //Αρχικοποίηση μεταβλητών
            luceneLeaderIndexDirectory = FSDirectory.Open(indexPathLead);
            List <Article> results          = new List <Article>();
            List <Article> CompleteResults2 = new List <Article>();

            if (searchTerm != "" && fields.Length != 0)
            {
                //Αρχικοποίηση μεταβλητών
                IndexSearcher searcher = new IndexSearcher(luceneLeaderIndexDirectory);
                //Δημιουργία Searcher κειμένου
                MultiFieldQueryParser allFieldsSearcher =
                    new MultiFieldQueryParser(LuceneVersion, fields, analyzer);

                //Parce το όρο αναζήτησης
                Query query = allFieldsSearcher.Parse(searchTerm);
                //Δημιουργία collector που θα φέρει τον leader
                TopScoreDocCollector topScoreDocCollector = TopScoreDocCollector.Create(1, true);
                //Πραγματοποίηση αναζήτησης
                searcher.Search(query, topScoreDocCollector);
                //Προσθήκη αποτελεσμάτων σε λίστα
                ScoreDoc[] hits = topScoreDocCollector.TopDocs().ScoreDocs;

                //Απομονώνουμε τον Leader
                Article  leader   = new Article();
                int      docId    = hits[0].Doc;
                float    score    = hits[0].Score;
                Document document = searcher.Doc(docId);
                leader.Score = Convert.ToDouble(score.ToString("0.0000"));
                leader.Id    = Convert.ToInt32(document.Get("ID"));
                results.Add(leader);

                //Έλεγχος αν υπάρχει το ευρετήριο αν όχι πέτα το μήνυμα
                if (!System.IO.Directory.Exists(indexPathFollower))
                {
                    throw new NullReferenceException("Index Does Not Exist");
                }
                //Αρχικοποίηση μεταβλητών
                luceneIndexDirectoryFollowers = FSDirectory.Open(indexPathFollower);

                //Αρχικοποίηση μεταβλητών
                IndexSearcher searcherFollowers = new IndexSearcher(luceneIndexDirectoryFollowers);
                //Δημιουργία Searcher κειμένου
                MultiFieldQueryParser allFieldsSearcherFollowers =
                    new MultiFieldQueryParser(LuceneVersion, fields, analyzer);
                //Filter filter = //new FieldValueFilter("Leader", new[] { leader.Id.ToString() });
                //new QueryWrapperFilter(new TermQuery(new Term("Leader", leader.Id.ToString())));
                //    //QueryWrapperFilter(new WildcardQuery(new Term("Leader", leader.Id.ToString())));
                ////FieldRangeFilter("Leader", leader.Id.ToString(), leader.Id.ToString(), true, true);

                //Parce το όρο αναζήτησης
                Query queryFollowers = allFieldsSearcherFollowers.Parse(searchTerm);
                //Δημιουργία collector που θα φέρει τα πρώτα 1000 αποτελέσματα
                TopScoreDocCollector topScoreDocCollectorFollowers = TopScoreDocCollector.Create(3200, true);
                //Πραγματοποίηση αναζήτησης
                searcherFollowers.Search(queryFollowers, topScoreDocCollectorFollowers);
                //Προσθήκη αποτελεσμάτων σε λίστα
                ScoreDoc[] Followershits = topScoreDocCollectorFollowers.TopDocs().ScoreDocs;

                foreach (ScoreDoc hitFollow in Followershits)
                {
                    Article art           = new Article();
                    int     docIdFollower = hitFollow.Doc;
                    float   scoreFollower = hitFollow.Score;

                    Document documentFollower = searcherFollowers.Doc(docIdFollower);

                    art.Score = Convert.ToDouble(scoreFollower.ToString("0.0000"));
                    art.Id    = Convert.ToInt32(documentFollower.Get("ID"));
                    int leaderID = Convert.ToInt32(documentFollower.Get("Leader"));

                    if (leaderID == leader.Id)
                    {
                        results.Add(art);
                    }
                }

                IEnumerable <Article> Articles = ArticleReader.ReadArticles(@"Data\cacm.all");
                //Προσθέτουμε τα άρθρα στα αποτελέσματα και τα scor του κάθε άρθρου
                foreach (Article res in results)
                {
                    foreach (Article article in Articles)
                    {
                        if (article.Id.ToString() == res.Id.ToString())
                        {
                            Article art = new Article();
                            art       = article;
                            art.Score = res.Score;
                            CompleteResults2.Add(art);
                            //break;
                        }
                    }
                }
                //Επιστρέφουμε τα αποτελέσματα στο χρήστη
                luceneLeaderIndexDirectory.Dispose();
                luceneIndexDirectoryFollowers.Dispose();
                return(CompleteResults2);
            }
            else
            {
                return(CompleteResults2);
            }
        }
Ejemplo n.º 2
0
        public IEnumerable <Article> Search(string searchTerm, string[] fields)
        {  //Έλεγχος αν υπάρχει το ευρετήριο αν όχι πέτα το μήνυμα
            if (!System.IO.Directory.Exists(indexPath))
            {
                throw new NullReferenceException("Index Does Not Exist");
            }
            //Αρχικοποίηση μεταβλητών
            luceneIndexDirectory = FSDirectory.Open(indexPath);
            List <Article> CompleteResults = new List <Article>();

            if (searchTerm != "" && fields.Length != 0)
            {
                //Αρχικοποίηση μεταβλητών
                IndexSearcher searcher = new IndexSearcher(luceneIndexDirectory);
                //Δημιουργία Searcher κειμένου
                MultiFieldQueryParser allFieldsSearcher =
                    new MultiFieldQueryParser(LuceneVersion, fields, analyzer);

                //Parce το όρο αναζήτησης
                Query query = allFieldsSearcher.Parse(searchTerm);
                //Δημιουργία collector που θα φέρει τα 100 πρώτα αποτελέσματα
                TopScoreDocCollector topScoreDocCollector = TopScoreDocCollector.Create(3200, true);
                //Πραγματοποίηση αναζήτησης
                searcher.Search(query, topScoreDocCollector);
                //Προσθήκη αποτελεσμάτων σε λίστα
                ScoreDoc[]     hits    = topScoreDocCollector.TopDocs().ScoreDocs;
                List <Article> results = new List <Article>();
                //Ανατρέχουμε τη λίστα αποτελεσμάτων με τη λίστα των άρθρων για να
                //επιστρέψουμε στο χρήστη τα ολόκληρα τα άρθρα.
                foreach (ScoreDoc hit in hits)
                {
                    Article art   = new Article();
                    int     docId = hit.Doc;
                    float   score = hit.Score;

                    Document document = searcher.Doc(docId);

                    art.Score = Convert.ToDouble(score.ToString("0.0000"));
                    art.Id    = Convert.ToInt32(document.Get("ID"));

                    results.Add(art);
                }

                IEnumerable <Article> Articles = ArticleReader.ReadArticles(@"Data\cacm.all");
                //Προσθέτουμε τα άρθρα στα αποτελέσματα και τα scor του κάθε άρθρου
                foreach (Article item in results)
                {
                    foreach (Article article in Articles)
                    {
                        if (article.Id == item.Id)
                        {
                            Article art = new Article();
                            art       = article;
                            art.Score = item.Score;
                            CompleteResults.Add(art);
                            break;
                        }
                    }
                }
                luceneIndexDirectory.Dispose();
                //Επιστρέφουμε τα αποτελέσματα στο χρήστη
                return(CompleteResults.OrderByDescending(x => x.Score));
            }
            else
            {
                return(CompleteResults);
            }
        }