public string Search(string strQuery) { string result = string.Empty; Lucene.Net.Index.IndexReader reader = Lucene.Net.Index.IndexReader.Open(Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["IndexingArticle"])); Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser("ArticleDetail", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); Lucene.Net.Search.Query query = parser.Parse(strQuery); Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(reader); Lucene.Net.Search.Hits hits = searcher.Search(query); Lucene.Net.Highlight.QueryScorer score = new Lucene.Net.Highlight.QueryScorer(query); Lucene.Net.Highlight.SimpleHTMLFormatter formater = new Lucene.Net.Highlight.SimpleHTMLFormatter("<span class='Highlight'>", "</span>"); Lucene.Net.Highlight.Highlighter highlighter = new Lucene.Net.Highlight.Highlighter(formater, score); result += "<div align='right' style='background-color:#F0F7F9; padding-right:15px' height='30px'><font style='FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #005482; FONT-FAMILY: arial'>Kết quả tìm thấy : " + hits.Length() + " </font></div>"; result += "<div style='padding: 10px 10px 10px 10px;'>"; for (int i = 0; i < hits.Length(); i++) { string id = hits.Doc(i).Get("ArticleId"); string title = hits.Doc(i).Get("ArticleTitle"); string detail = hits.Doc(i).Get("ArticleDetail"); Lucene.Net.Analysis.TokenStream ts = (new Lucene.Net.Analysis.Standard.StandardAnalyzer()).TokenStream("ArticleDetail", new System.IO.StringReader(detail)); result += string.Format("<div align='left'><font style='FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #5b5b5b; FONT-FAMILY: arial'><a href='/?ArticleId={0}'>{1}</a></font>", id, title); result += string.Format("<div align='left'><font style='FONT-SIZE: 9pt' face='Arial' color='#005482'>...{0}...</font></div></div></br>", highlighter.GetBestFragment(ts, detail)); } result += "</div>"; reader.Close(); return(result); }
public virtual void TestGetValuesForIndexedDocument() { RAMDirectory dir = new RAMDirectory(); IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true); writer.AddDocument(MakeDocumentWithFields()); writer.Close(); Searcher searcher = new IndexSearcher(dir); // search for something that does exists Query query = new TermQuery(new Term("keyword", "test1")); // ensure that queries return expected results without DateFilter first Hits hits = searcher.Search(query); Assert.AreEqual(1, hits.Length()); try { DoAssert(hits.Doc(0), true); } catch (System.Exception e) { System.Console.Error.WriteLine(e.StackTrace); System.Console.Error.Write("\n"); } finally { searcher.Close(); } }
public List <LuceneData> MemberSearch(string searchTerm) { var searchData = new List <LuceneData>(); try { Lucene.Net.Store.Directory dir = Lucene.Net.Store.FSDirectory.GetDirectory(_indexFileLocation); //create an analyzer to process the text Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(); //create the query parser, with the default search feild set to "content" Lucene.Net.QueryParsers.QueryParser queryParser = new Lucene.Net.QueryParsers.QueryParser("SearchContent", analyzer); //parse the query string into a Query object Lucene.Net.Search.Query query = queryParser.Parse(searchTerm); //create an index searcher that will perform the search //Lucene.Net.Index.IndexReader indexReader = Lucene.Net.Index.IndexReader.Open(dir, true); Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(dir, true); ////build a query object //Lucene.Net.Index.Term luceneSearchTerm = new Lucene.Net.Index.Term("searchContent", searchTerm); //Lucene.Net.Search.Query query = new Lucene.Net.Search.TermQuery(luceneSearchTerm); //execute the query Lucene.Net.Search.Hits hits = searcher.Search(query); //int resultCount = hits.Length(); //if (resultCount > 1000){ // resultCount = 1000; //} //iterate over the results. for (int i = 0; i < hits.Length(); i++) { Lucene.Net.Documents.Document doc = hits.Doc(i); searchData.Add(new LuceneData { MemberID = Convert.ToInt32(doc.Get("MemberID")), FirstName = doc.Get("FirstName"), LastName = doc.Get("LastName"), CompanyName = doc.Get("CompanyName"), City = doc.Get("City"), State = doc.Get("State"), PostalCode = doc.Get("PostalCode") }); } } catch (Exception ex) { } return(searchData); }
public string SearchAndPaging(string strQuery, string index) { string result = string.Empty; try { List <SearchArticle> searchArticleList = new List <SearchArticle>(); PSCPortal.CMS.ArticleCollection ArticleList = ArticleCollection.GetArticleCollectionPublish(); string nameSub = Libs.Ultility.GetSubDomain() == string.Empty ? "HomePage" : Libs.Ultility.GetSubDomain(); SubDomain subDomain = PSCPortal.Engine.SubDomain.GetSubByName(nameSub); PageCollection pagesBelongTo = subDomain.GetPagesBelongTo(); string strId = string.Empty; foreach (var page in pagesBelongTo) { foreach (var ar in ArticleList.Where(ar => ar.PageId == page.Id)) { strId += ar.Id + " OR "; } if (strId.Length > 0) { strId = strId.Remove(strId.Length - 3, 3); } } int pageIndex = Int32.Parse(index); string strSearch = " ArticleDetail:(" + strQuery + ") AND ArticleId:" + "( " + strId + " )"; Lucene.Net.Index.IndexReader reader = Lucene.Net.Index.IndexReader.Open(Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["IndexingArticle"])); Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser("ArticleDetail", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); Lucene.Net.Search.Query query = parser.Parse(strSearch); Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(reader); Lucene.Net.Search.Hits hits = searcher.Search(query); Lucene.Net.Highlight.QueryScorer score = new Lucene.Net.Highlight.QueryScorer(query); Lucene.Net.Highlight.SimpleHTMLFormatter formater = new Lucene.Net.Highlight.SimpleHTMLFormatter("<span class='Highlight'>", "</span>"); Lucene.Net.Highlight.Highlighter highlighter = new Lucene.Net.Highlight.Highlighter(formater, score); result += hits.Length() + "_" + "<div class='blog_news'><div class='topic_news_title1'><div class='topic_news_title'><a href='#'>Kết quả tìm thấy: " + hits.Length() + "</a></div></div>"; result += "<div class='ct_topic_l'><div class='ct_topic_r1'>"; for (int i = pageIndex * 20 - 20; i < pageIndex * 20 && i < hits.Length(); i++) { string detail = hits.Doc(i).Get("ArticleDetail"); Lucene.Net.Analysis.TokenStream ts = (new Lucene.Net.Analysis.Standard.StandardAnalyzer()).TokenStream("ArticleDetail", new System.IO.StringReader(detail)); SearchArticle searchArticle = new SearchArticle(); searchArticle.Id = hits.Doc(i).Get("ArticleId");; searchArticle.Title = hits.Doc(i).Get("ArticleTitle"); searchArticle.Highligth = highlighter.GetBestFragment(ts, detail); searchArticleList.Add(searchArticle); } reader.Close(); JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary <string, object> resultDic = new Dictionary <string, object>(); resultDic["Count"] = hits.Length(); resultDic["Data"] = searchArticleList; result = serializer.Serialize(resultDic); } catch (Exception e) { } return(result); }
public static Lucene.Net.Search.Hits search(Lucene.Net.Search.Query query) { Lucene.Net.Search.Hits hits = null; lock (my_lock) // prevent contention between searches and writing? { if (searcher == null) { searcher = new Lucene.Net.Search.IndexSearcher(MyLucene.index_path); } hits = searcher.Search(query); } return(hits); }
public virtual void TestIterator() { RAMDirectory directory = new RAMDirectory(); IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); Document doc = new Document(); doc.Add(new Field("field", "iterator test doc 1", Field.Store.YES, Field.Index.ANALYZED)); writer.AddDocument(doc); doc = new Document(); doc.Add(new Field("field", "iterator test doc 2", Field.Store.YES, Field.Index.ANALYZED)); writer.AddDocument(doc); writer.Close(); _TestUtil.CheckIndex(directory); IndexSearcher searcher = new IndexSearcher(directory); Hits hits = searcher.Search(new TermQuery(new Term("field", "iterator"))); HitIterator iterator = (HitIterator)hits.Iterator(); Assert.AreEqual(2, iterator.Length()); Assert.IsTrue(iterator.MoveNext()); Hit hit = (Hit)iterator.Current; Assert.AreEqual("iterator test doc 1", hit.Get("field")); Assert.IsTrue(iterator.MoveNext()); hit = (Hit)iterator.Current; Assert.AreEqual("iterator test doc 2", hit.GetDocument().Get("field")); Assert.IsFalse(iterator.MoveNext()); bool caughtException = false; try { System.Object generatedAux = iterator.Current; } catch (System.ArgumentOutOfRangeException e) { Assert.IsTrue(true); caughtException = true; } Assert.IsTrue(caughtException); }
public static void Main(System.String[] a) { System.String indexName = "localhost_index"; System.String fn = "c:/Program Files/Apache Group/Apache/htdocs/manual/vhosts/index.html.en"; System.Uri url = null; for (int i = 0; i < a.Length; i++) { if (a[i].Equals("-i")) { indexName = a[++i]; } else if (a[i].Equals("-f")) { fn = a[++i]; } else if (a[i].Equals("-url")) { url = new System.Uri(a[++i]); } } System.IO.StreamWriter temp_writer; temp_writer = new System.IO.StreamWriter(System.Console.OpenStandardOutput(), System.Console.Out.Encoding); temp_writer.AutoFlush = true; System.IO.StreamWriter o = temp_writer; IndexReader r = IndexReader.Open(indexName); o.WriteLine("Open index " + indexName + " which has " + r.NumDocs() + " docs"); MoreLikeThis mlt = new MoreLikeThis(r); o.WriteLine("Query generation parameters:"); o.WriteLine(mlt.DescribeParams()); o.WriteLine(); Query query = null; if (url != null) { o.WriteLine("Parsing URL: " + url); query = mlt.Like(url); } else if (fn != null) { o.WriteLine("Parsing file: " + fn); query = mlt.Like(new System.IO.FileInfo(fn)); } o.WriteLine("q: " + query); o.WriteLine(); IndexSearcher searcher = new IndexSearcher(indexName); Hits hits = searcher.Search(query); int len = hits.Length(); o.WriteLine("found: " + len + " documents matching"); o.WriteLine(); for (int i = 0; i < System.Math.Min(25, len); i++) { Document d = hits.Doc(i); System.String summary = d.Get("summary"); o.WriteLine("score : " + hits.Score(i)); o.WriteLine("url : " + d.Get("url")); o.WriteLine("\ttitle : " + d.Get("title")); if (summary != null) { o.WriteLine("\tsummary: " + d.Get("summary")); } o.WriteLine(); } }
public virtual void DoSearching(Query unReWrittenQuery) { searcher = new IndexSearcher(ramDir); //for any multi-term queries to work (prefix, wildcard, range,fuzzy etc) you must use a rewritten query! query = unReWrittenQuery.Rewrite(reader); System.Console.Out.WriteLine("Searching for: " + query.ToString(FIELD_NAME)); hits = searcher.Search(query); }
public virtual void TestMultiSearcher() { //setup index 1 RAMDirectory ramDir1 = new RAMDirectory(); IndexWriter writer1 = new IndexWriter(ramDir1, new StandardAnalyzer(), true); Document d = new Document(); Field f = new Field(FIELD_NAME, "multiOne", Field.Store.YES, Field.Index.TOKENIZED); d.Add(f); writer1.AddDocument(d); writer1.Optimize(); writer1.Close(); IndexReader reader1 = IndexReader.Open(ramDir1); //setup index 2 RAMDirectory ramDir2 = new RAMDirectory(); IndexWriter writer2 = new IndexWriter(ramDir2, new StandardAnalyzer(), true); d = new Document(); f = new Field(FIELD_NAME, "multiTwo", Field.Store.YES, Field.Index.TOKENIZED); d.Add(f); writer2.AddDocument(d); writer2.Optimize(); writer2.Close(); IndexReader reader2 = IndexReader.Open(ramDir2); IndexSearcher[] searchers = new IndexSearcher[2]; searchers[0] = new IndexSearcher(ramDir1); searchers[1] = new IndexSearcher(ramDir2); MultiSearcher multiSearcher = new MultiSearcher(searchers); QueryParser parser = new QueryParser(FIELD_NAME, new StandardAnalyzer()); parser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE); query = parser.Parse("multi*"); System.Console.Out.WriteLine("Searching for: " + query.ToString(FIELD_NAME)); //at this point the multisearcher calls combine(query[]) hits = multiSearcher.Search(query); //query = QueryParser.parse("multi*", FIELD_NAME, new StandardAnalyzer()); Query[] expandedQueries = new Query[2]; expandedQueries[0] = query.Rewrite(reader1); expandedQueries[1] = query.Rewrite(reader2); query = query.Combine(expandedQueries); //create an instance of the highlighter with the tags used to surround highlighted text Highlighter highlighter = new Highlighter(this, new QueryScorer(query)); for (int i = 0; i < hits.Length(); i++) { System.String text = hits.Doc(i).Get(FIELD_NAME); TokenStream tokenStream = analyzer.TokenStream(FIELD_NAME, new System.IO.StringReader(text)); System.String highlightedText = highlighter.GetBestFragment(tokenStream, text); System.Console.Out.WriteLine(highlightedText); } Assert.IsTrue(numHighlights == 2, "Failed to find correct number of highlights " + numHighlights + " found"); }
/// <summary> Suggest similar words (restricted or not to a field of a user index)</summary> /// <param name="word">String the word you want a spell check done on /// </param> /// <param name="num_sug">int the number of suggest words /// </param> /// <param name="ir">the indexReader of the user index (can be null see field param) /// </param> /// <param name="field">String the field of the user index: if field is not null, the suggested /// words are restricted to the words present in this field. /// </param> /// <param name="morePopular">boolean return only the suggest words that are more frequent than the searched word /// (only if restricted mode = (indexReader!=null and field!=null) /// </param> /// <throws> IOException </throws> /// <returns> String[] the sorted list of the suggest words with this 2 criteria: /// first criteria: the edit distance, second criteria (only if restricted mode): the popularity /// of the suggest words in the field of the user index /// </returns> public virtual System.String[] SuggestSimilar(System.String word, int num_sug, IndexReader ir, System.String field, bool morePopular) { float min = this.minScore; TRStringDistance sd = new TRStringDistance(word); int lengthWord = word.Length; int goalFreq = (morePopular && ir != null) ? ir.DocFreq(new Term(field, word)) : 0; if (!morePopular && goalFreq > 0) { return(new System.String[] { word }); // return the word if it exist in the index and i don't want a more popular word } BooleanQuery query = new BooleanQuery(); System.String[] grams; System.String key; for (int ng = GetMin(lengthWord); ng <= GetMax(lengthWord); ng++) { key = "gram" + ng; // form key grams = FormGrams(word, ng); // form word into ngrams (allow dups too) if (grams.Length == 0) { continue; // hmm } if (bStart > 0) { // should we boost prefixes? Add(query, "start" + ng, grams[0], bStart); // matches start of word } if (bEnd > 0) { // should we boost suffixes Add(query, "end" + ng, grams[grams.Length - 1], bEnd); // matches end of word } for (int i = 0; i < grams.Length; i++) { Add(query, key, grams[i]); } } IndexSearcher searcher = new IndexSearcher(this.spellindex); Hits hits = searcher.Search(query); SuggestWordQueue sugqueue = new SuggestWordQueue(num_sug); int stop = Math.Min(hits.Length(), 10 * num_sug); // go thru more than 'maxr' matches in case the distance filter triggers SuggestWord sugword = new SuggestWord(); for (int i = 0; i < stop; i++) { sugword.string_Renamed = hits.Doc(i).Get(F_WORD); // get orig word) if (sugword.string_Renamed.Equals(word)) { continue; // don't suggest a word for itself, that would be silly } //edit distance/normalize with the min word length sugword.score = 1.0f - ((float)sd.GetDistance(sugword.string_Renamed) / System.Math.Min(sugword.string_Renamed.Length, lengthWord)); if (sugword.score < min) { continue; } if (ir != null) { // use the user index sugword.freq = ir.DocFreq(new Term(field, sugword.string_Renamed)); // freq in the index if ((morePopular && goalFreq > sugword.freq) || sugword.freq < 1) { // don't suggest a word that is not present in the field continue; } } sugqueue.Insert(sugword); if (sugqueue.Size() == num_sug) { //if queue full , maintain the min score min = ((SuggestWord)sugqueue.Top()).score; } sugword = new SuggestWord(); } // convert to array string System.String[] list = new System.String[sugqueue.Size()]; for (int i = sugqueue.Size() - 1; i >= 0; i--) { list[i] = ((SuggestWord)sugqueue.Pop()).string_Renamed; } searcher.Close(); return(list); }
public SearchModel Search(string searchText) { var result = new SearchModel(); if (string.IsNullOrEmpty(searchText)) { result.Message = "Įveskite paieškos užklausą."; return(result); } var stemmedSearchText = new LithuanianStemmer().Stem(searchText.Trim()); if (string.IsNullOrEmpty(stemmedSearchText)) { result.Message = "Įveskite paieškos užklausą."; return(result); } Lucene.Net.Search.Hits hits = null; try { if (char.IsLetter(stemmedSearchText[stemmedSearchText.Length - 1])) { stemmedSearchText += "*"; } query = parser.Parse(stemmedSearchText); if (searcher == null) { searcher = new Lucene.Net.Search.IndexSearcher(CustomAppSettings.SearchIndexFolder); } hits = searcher.Search(query); } catch (Exception e) { result.Message = "Paieška nepavyko. Pataisykite užklausą. Klaidos pranešimas: " + e.Message; return(result); } Lucene.Net.Highlight.Formatter formatter = new Lucene.Net.Highlight.SimpleHTMLFormatter( "<span class=\"highlightResult\">", "</span>"); var fragmenter = new Lucene.Net.Highlight.SimpleFragmenter(100); var scorer = new Lucene.Net.Highlight.QueryScorer(searcher.Rewrite(query)); var highlighter = new Lucene.Net.Highlight.Highlighter(formatter, scorer); highlighter.SetTextFragmenter(fragmenter); Dictionary <string, int> dict_already_seen_ids = new Dictionary <string, int>(); var list = new List <SearchIndexModel>(); // insert the search results into a temp table which we will join with what's in the database for (int i = 0; i < hits.Length(); i++) { if (dict_already_seen_ids.Count < 100) { Lucene.Net.Documents.Document doc = hits.Doc(i); string id = doc.Get("id"); if (!dict_already_seen_ids.ContainsKey(id)) { dict_already_seen_ids[id] = 1; var model = new SearchIndexModel(); model.Id = id; model.Score = hits.Score(i); model.Subject = doc.Get("subject"); model.Type = (EntryTypes)Enum.Parse(typeof(EntryTypes), doc.Get("type")); string raw_text = HttpUtility.HtmlEncode(doc.Get("raw_text")); //string raw_text = doc.Get("raw_text"); Lucene.Net.Analysis.TokenStream stream = analyzer.TokenStream("text", new System.IO.StringReader( raw_text)); string highlighted_text = highlighter.GetBestFragments(stream, raw_text, 3, "...").Replace("'", "''"); if (highlighted_text == "") // someties the highlighter fails to emit text... { highlighted_text = raw_text.Replace("'", "''"); } if (highlighted_text.Length > 3000) { highlighted_text = highlighted_text.Substring(0, 3000); } model.HighlightedText = highlighted_text; list.Add(model); } } else { break; } } result.List = list; result.SearchPhrase = searchText; if (list.Count == 0) { result.Message = string.Format("Įrašų pagal užklausą '{0}' nerasta. Patikslinkite paieškos duomenis.", searchText); } return(result); }
/// <summary> /// 命中结果集合 /// </summary> /// <param name="hits">索引结果集合</param> /// <param name="reader">索引读取器</param> /// <param name="terms">关键字分词结果数组</param> public Hits(Lucene.Net.Search.Hits hits, IndexReader reader, string[] terms) { base.reader = reader; base._hits = hits; base.terms = terms; }
public static void Main(System.String[] args) { try { Searcher searcher = new IndexSearcher(@"index"); Analyzer analyzer = new StandardAnalyzer(); System.IO.StreamReader in_Renamed = new System.IO.StreamReader(new System.IO.StreamReader(System.Console.OpenStandardInput(), System.Text.Encoding.Default).BaseStream, new System.IO.StreamReader(System.Console.OpenStandardInput(), System.Text.Encoding.Default).CurrentEncoding); while (true) { System.Console.Out.Write("Query: "); System.String line = in_Renamed.ReadLine(); if (line.Length == -1) { break; } Query query = QueryParser.Parse(line, "contents", analyzer); System.Console.Out.WriteLine("Searching for: " + query.ToString("contents")); Hits hits = searcher.Search(query); System.Console.Out.WriteLine(hits.Length() + " total matching documents"); int HITS_PER_PAGE = 10; for (int start = 0; start < hits.Length(); start += HITS_PER_PAGE) { int end = System.Math.Min(hits.Length(), start + HITS_PER_PAGE); for (int i = start; i < end; i++) { Document doc = hits.Doc(i); System.String path = doc.Get("path"); if (path != null) { System.Console.Out.WriteLine(i + ". " + path); } else { System.String url = doc.Get("url"); if (url != null) { System.Console.Out.WriteLine(i + ". " + url); System.Console.Out.WriteLine(" - " + doc.Get("title")); } else { System.Console.Out.WriteLine(i + ". " + "No path nor URL for this document"); } } } if (hits.Length() > end) { System.Console.Out.Write("more (y/n) ? "); line = in_Renamed.ReadLine(); if (line.Length == 0 || line[0] == 'n') { break; } } } } searcher.Close(); } catch (System.Exception e) { System.Console.Out.WriteLine(" caught a " + e.GetType() + "\n with message: " + e.Message); } }
public string GetStudentsByYearIdAndTimesIdAndSchoolIdAndStudentName(string schoolYear, string times, string schoolId, string StudentName, string pIndex) { string result = string.Empty; int pageIndex = Int32.Parse(pIndex); ArrayList students = new ArrayList(); string pathOfIndexFile = Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["StudentIndexing"].ToString()); if (Int32.Parse(schoolYear) >= 2000) { pathOfIndexFile += "\\" + schoolYear + "\\Index"; } string studentName = StudentName.Replace("\"", ""); studentName = "\"" + studentName + "\""; Lucene.Net.Search.IndexSearcher iSearcher = new Lucene.Net.Search.IndexSearcher(pathOfIndexFile); Lucene.Net.QueryParsers.QueryParser qYearParser = new Lucene.Net.QueryParsers.QueryParser("YearId", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); Lucene.Net.Search.Query iYearQuery = qYearParser.Parse(schoolYear); Lucene.Net.QueryParsers.QueryParser qTestDayParser = new Lucene.Net.QueryParsers.QueryParser("TestDayId", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); Lucene.Net.Search.Query iTestDayQuery = qTestDayParser.Parse(times); Lucene.Net.QueryParsers.QueryParser qStudentIdParser = new Lucene.Net.QueryParsers.QueryParser("StudentID", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); Lucene.Net.Search.Query iStudentIdQuery = qStudentIdParser.Parse("1"); ////////////////////////////////////////////////////////////////////// Lucene.Net.Search.BooleanQuery bQuery = new Lucene.Net.Search.BooleanQuery(); bQuery.Add(iYearQuery, Lucene.Net.Search.BooleanClause.Occur.MUST); bQuery.Add(iTestDayQuery, Lucene.Net.Search.BooleanClause.Occur.MUST); if (StudentName != " " && StudentName != "") { Lucene.Net.QueryParsers.QueryParser qStudentParser = new Lucene.Net.QueryParsers.QueryParser("StudentName", new Lucene.Net.Analysis.Standard.StandardAnalyzer()); Lucene.Net.Search.Query iStudentQuery = qStudentParser.Parse(studentName); bQuery.Add(iStudentQuery, Lucene.Net.Search.BooleanClause.Occur.MUST); } Lucene.Net.Search.Hits iHits = iSearcher.Search(bQuery); using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["PSCPortalConnectionString"].ConnectionString)) { con.Open(); //paging for (int i = pageIndex * 20 - 20; i < pageIndex * 20 && i < iHits.Length(); i++) { string yId = iHits.Doc(i).Get("YearId"); string stuId = iHits.Doc(i).Get("StudentID"); string testDayId = iHits.Doc(i).Get("TestDayId"); System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand(); com.Connection = con; com.CommandType = CommandType.Text; com.CommandText = @" select StudentTHPT.TotalMark,[RoundTotalMark],StudentTHPT.YearId,StudentTHPT.TestDayId,StudentId,FirstName+' '+MiddleName+' '+LastName as FullName,Sex,Birthday,MarkEncourage,Section.Name from StudentTHPT inner join Section on StudentTHPT.SectionId = Section.SectionId where StudentTHPT.YearId=@yearId and StudentTHPT.TestDayId=@timeId and StudentId = @studentId Order by LastName " ; com.Parameters.Add("@yearId", SqlDbType.NChar); com.Parameters["@yearId"].Value = yId; com.Parameters.Add("@timeId", SqlDbType.NVarChar); com.Parameters["@timeId"].Value = testDayId; com.Parameters.Add("@studentId", SqlDbType.NVarChar); com.Parameters["@studentId"].Value = stuId; using (System.Data.SqlClient.SqlDataReader reader = com.ExecuteReader()) { while (reader.Read()) { string fullName = reader["FullName"].ToString(); string birthday = reader["Birthday"].ToString().Trim(); string studentId = reader["StudentId"].ToString(); string total = iHits.Length().ToString(); // string markEncourage = reader["MarkEncourage"].ToString(); string totalMark = reader["TotalMark"].ToString(); string section = reader["Name"].ToString(); string roundTotalMark = reader["RoundTotalMark"].ToString(); Student s = new Student { StudentId = studentId, FullName = fullName, Birthday = birthday, Total = total, Section = section, TotalMark = totalMark, RoundTotalMark = roundTotalMark }; students.Add(s); } } } } iSearcher.Close(); System.Web.Script.Serialization.JavaScriptSerializer serialize = new System.Web.Script.Serialization.JavaScriptSerializer(); result = serialize.Serialize(students); return(result); }