コード例 #1
0
        public void BuildLeaderIndex(IEnumerable <Article> Articles)
        {
            int leadersNumber = (int)Math.Ceiling(Math.Sqrt(Articles.Count()));

            IEnumerable <Article> LeaderArticles = Articles.OrderBy(i => i.GetHashCode()).Take(leadersNumber);

            //Έλεγχος αν υπάρχει ο κατάλογος, αν ναι να διαγραφεί
            if (System.IO.Directory.Exists(indexPathLead))
            {
                System.IO.Directory.Delete(indexPathLead, true);
            }
            //Αρχικοποιούμε τις μεταβλητές
            luceneLeaderIndexDirectory = FSDirectory.Open(indexPathLead);
            writerLead = new IndexWriter(luceneLeaderIndexDirectory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
            //Για κάθε άρθρο εισάγουμε τα στοιχεία στο ευρετήριο
            foreach (var article in LeaderArticles)
            {
                Document doc = new Document();
                //Προσθέτουμε το ID χωρίς να περνάει από Analyzer αυτούσιο
                doc.Add(new Field("ID", article.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));

                if (article.Title != null)
                {
                    //Προσθέτουμε τον Τίτλο αν υπάρχει αφού αφαιρέσουμε τα common words
                    string Title = ArticleReader.StringWordsRemove(article.Title);
                    //Προστίθονται όλες οι λέξεις με μικρά, περνόντας από τον Analyzer(Porter Stemmer)
                    doc.Add(new Field("Title", Title.ToLower(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
                }
                if (article.Summary != null)
                {
                    //Προσθέτουμε το Summary αν υπάρχει αφού αφαιρέσουμε τα common words
                    string Summary = ArticleReader.StringWordsRemove(article.Summary);
                    //Προστίθονται όλες οι λέξεις με μικρά, περνόντας από τον Analyzer(Porter Stemmer)
                    doc.Add(new Field("Summary", Summary.ToLower(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
                }

                foreach (var author in article.Authors)
                {
                    if (author != null)
                    {
                        //Προσθέτουμε τους Συγγραφείς αν υπάρχουν
                        doc.Add(new Field("Author", author.ToLowerInvariant(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    }
                }
                //Προσθέτουμε το έγγραφο στο ευρετήριο
                writerLead.AddDocument(doc);
            }
            //Optimization και απελευθέρωση από τη μνήμη τα αντικείμενα
            writerLead.Optimize();
            writerLead.Flush(true, true, true);
            writerLead.Dispose();
            luceneLeaderIndexDirectory.Dispose();
        }
コード例 #2
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);
            }
        }
コード例 #3
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);
            }
        }
コード例 #4
0
 public static string StringWordsRemove(string stringToClean)
 {
     return(string.Join(" ", stringToClean
                        .Split(new[] { ' ', ',', '.', '?', '!', '-', '\r', '\n', '"', ')', '(' }, StringSplitOptions.RemoveEmptyEntries)
                        .Except(ArticleReader.CommonWords(@"Data\common_words"))));
 }