小菜學習Lucene.Net(更新3.0.3版本使用)

花了兩天的時間研究了下Lucene.Net 發現確實挺好玩.... 最新版本是3.0.3 (最後更新時間2012-10)web

  惋惜3.0.3版本的Lucene.net沒法和盤古分詞 (最新版爲2.3.1.0 最後更新時間 2010-10)一塊兒使用.....由於盤古分詞 基於2.9.x.x版本 寫的 ,在 3.0.3中不少 接口 和 類名 發生了 變化..(固然 網上 也有解決方案 :基於新的接口 從新 編譯 盤古分詞)ide

  今天主要用的是 Lucene.Net 2.9.2.2 與盤古分詞 2.3.0.0版本.this

  主要功能就是 建立索引,和搜索 下面貼出 2段代碼spa

      建立索引:.net

  

  View Code

    搜索代碼:3d

複製代碼
string indexPath = @"C:\lucenedir";//最好將該項放在配置文件中。
            string kw = Request["txtContent"];
            kw = kw.ToLower();
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
            IndexReader reader = IndexReader.Open(directory, true);
            IndexSearcher searcher = new IndexSearcher(reader);
            //搜索條件
           //PhraseQuery query = new PhraseQuery();
       BooleanQuery queryMsg = new BooleanQuery();//或者條件
       TermQuery query = null;
            foreach (string word in Common.WebCommon.SplitWord(kw))//將用戶輸入的搜索內容進行了盤古分詞、
            {
                 query = new TermQuery(new Term("msg", word));
                //query.Add(new Term("msg", word));
              queryMsg.Add(query, BooleanClause.Occur.SHOULD);
                
            }
        
            //query.SetSlop(100);//多個查詢條件的詞之間的最大距離.在文章中相隔太遠 也就無心義.(例如 「大學生」這個查詢條件和"簡歷"這個查詢條件之間若是間隔的詞太多也就沒有意義了。)
            //TopScoreDocCollector是盛放查詢結果的容器
            TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
            searcher.Search(queryMsg, null, collector);//根據query查詢條件進行查詢,查詢結果放入collector容器
            ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//獲得全部查詢結果中的文檔,GetTotalHits():表示總條數   TopDocs(300, 20);//表示獲得300(從300開始),到320(結束)的文檔內容.       //能夠用來實現分頁功能
    
            List<SearchResult> list = new List<SearchResult>();
            for (int i = 0; i < docs.Length; i++)
            {
                //
                //搜索ScoreDoc[]只能得到文檔的id,這樣不會把查詢結果的Document一次性加載到內存中。下降了內存壓力,須要得到文檔的詳細內容的時候經過searcher.Doc來根據文檔id來得到文檔的詳細內容對象Document.
                int docId = docs[i].doc;//獲得查詢結果文檔的id(Lucene內部分配的id)
                Document doc = searcher.Doc(docId);//找到文檔id對應的文檔詳細信息
                SearchResult result = new SearchResult();
                result.Msg =Common.WebCommon.Highlight(kw,doc.Get("msg"));
                result.Title = doc.Get("title");
                result.Url = "/BookDeatail.apsx?id=" + doc.Get("id");
                list.Add(result);
            }
            this.SearchRepeater.DataSource = list;
            this.SearchRepeater.DataBind();
         
           
複製代碼

大致 思路就是 這樣子 不錯 這兩坨代碼 太難看了 因而 我基於這2段 代碼 封裝下了因而有了  LuceneHelpercode

  View Code

使用方法:orm

  View Code

 以上爲2.9.2.2 版本對象

通過幾天的摸索,發現 3.0.3 改變不是很大...因而寫了一份Lucene3.0.3的Helperblog

代碼:

  View Code

使用方式 通上個版本 只是修改 版本的兼容性

相關文章
相關標籤/搜索