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); } }