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(); }
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); } }
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); } }
public static string StringWordsRemove(string stringToClean) { return(string.Join(" ", stringToClean .Split(new[] { ' ', ',', '.', '?', '!', '-', '\r', '\n', '"', ')', '(' }, StringSplitOptions.RemoveEmptyEntries) .Except(ArticleReader.CommonWords(@"Data\common_words")))); }