隨筆-54  評論-0  文章-2  trackbacks-0
           
                     Lucene

          今天由湯陽光老師(不如說是湯兄)給我們講lucene,一見湯兄,太年輕了,真是這感覺真讓我有些小慚愧,呵呵。。。還是學好技術是第一要務。

          從 現在到年前都是湯兄給我們上課,今天和明天是搜索引擎,存儲數據用的是Hibernate,全文檢索的簡化框架是Compass,Lucene講1.5 天,Compass講半天。總結一天所學的.全文檢索是目前最流行的技術,由于用數據庫搜索實現的匹配度,相關度排序和搜索速度太慢,而這些都非常致命。 下面詳細回顧:

          1.信息檢索:找出與用戶需求相關的信息

          平時接觸的信息有文:html,doc,pdf和 txt,

          多媒體:音頻,視頻,圖片...

          全文檢索:  1.只關注文本。比如我搜索:中國的首都在哪里?和我搜索中國 首都 北京是一樣的,我們主要是研究出現了某些詞的文本 2.不處理語義,只是詞匹配

          全文檢索的作用:1.bbs,blog,news,商城的站內搜索,資源有限

          Eclipse的幫助就是用Lucene做的

          2.入門

          運行原理/入門概念

          Hello World

          需求:就像百度的搜索框一樣,輸入內容,點擊搜索,得出結果,并且要求時間非常短
          后臺:點搜索后,會去信息集合(索引庫)里搜索,注:這個索引庫是按照一定的結構存儲,這個結構可以實現快速搜索
          使用流程:1事先就不停再找,建立索引,2.搜索
          索引庫的結構:索引庫是存到一些二進制文件,這些文件在同一個目錄下  --à索引庫目錄
          Document  一條數據
          Field  數據中的一個字段

          Field是組成Document的元素

          實現:
          步驟:1.建立索引

                2.搜索

                都用到的是分詞器(analyzer),應使用同一種分詞器

          實現HelloWorld:添加jar包

          lucene-core-2.4.0.jar(核心);
          contrib/analyzers/lucene-analyzers-2.4.0.jar(分詞器);
          contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);
            1.建立Article.java,屬性有id,title,content
           2.HelloWorld.java.兩個主要方法:
              1.建立索引:
               createIndex()    
              2.搜索
              search()
          進行搜索
          public void search() throws Exception {
              String queryString = "document";
              // 1,把要搜索的文本解析為 Query
              String[] fields = { "name", "content" };
             QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
              Query query = queryParser.parse(queryString);
           
              // 2,進行查詢
              IndexSearcher indexSearcher = new IndexSearcher(indexPath);
              Filter filter = null;
              TopDocs topDocs = indexSearcher.search(query, filter, 10000);
              System.out.println("總共有【"+topDocs.totalHits+"】條匹配結果");
                 // 3,打印結果
              for(ScoreDoc scoreDoc : topDocs.scoreDocs){
                 int docSn = scoreDoc.doc; // 文檔內部編號
                 Document doc = indexSearcher.doc(docSn); // 根據編號取出相應的文檔
                 File2DocumentUtils.printDocumentInfo(doc; // 打印出文檔信息
              }
          }

          IndexWriter:操作索引庫,增刪改
          主要方法介紹:

                 // 構造方法:如果索引庫不存在,會自動創建。如果存在,就使用他
                 new IndexWriter(String/Directory indexPath, Analyzer a, MaxFieldLength mfl)
                 // 構造方法:第三個參數指定是否創建一個新的索引庫。
                 // 1,有索引庫,create為true:會重新創建。2,沒有索引庫,create為false,會報錯。
                 new IndexWriter(String/Directory indexPath, Analyzer a, boolean create, MaxFieldLe
          ngth mfl)
                 // 添加索引
                 addDocument( Document doc )
                 // 更新
                 updateDocument(Term term, Document doc)
                 // 刪除
                 deleteDocument(Term term)
                 // 合并索引庫
                 addIndexesNoOptimize(Directory[])

          今天學了Lucene的入門,明天學習Lucene的高級知識,以及compass框架!
                 // 優化索引庫
                 optimize()
          IndexSearcher:操作索引庫,查詢
                 // 構造方法,索引庫不存在,就報錯
                 new IndexSearcher( String indexPath )
                 // 搜索
                 TopDocs search( Query query, Filter filer, int n )
                 // 搜索
                 TopDocs search( Query query, Filter filer, int n , Sort sort)
                
          Document doc( int docSn )
          Documet:Lucene所操作的對象
          Field:組成Document的元素,代表一個屬性。Store、Index
            new Field( String name, String value, Store store, Index index )

          Directory:索引庫(目錄)
                 FSDirectory    :真實的目錄
                 RAMDirectory:在內存中的一個虛擬的目錄
           
          QueryParser:把查詢字符串變為查詢對象的工具。使用子類: MultiFieldQueryParser
                new MultiFieldQueryParser(String[] fields, Analyzer a)
          Term:代表某個屬性中的一個關鍵詞(目錄中出現的條目),是搜索的最小單位
          Query :查詢對象(封裝的過濾條件)。有很多子類,對應各種各樣的查詢方式。
          TopDocs(一套) :代表查詢結果
          今天知識比較少,可回顧以前的知識,呵呵。。。
          posted on 2010-01-31 23:33 d66380022 閱讀(973) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 武宣县| 荆州市| 华亭县| 东辽县| 景谷| 宜宾县| 丹东市| 横峰县| 慈利县| 静宁县| 黄陵县| 吐鲁番市| 东明县| 临沂市| 虹口区| 连城县| 大洼县| 和静县| 思茅市| 霍山县| 正蓝旗| 大石桥市| 永定县| 河曲县| 绥宁县| 铜陵市| 雷山县| 姜堰市| 施甸县| 通榆县| 营山县| 峨边| 新泰市| 天峨县| 花莲市| 涞源县| 明光市| 滁州市| 政和县| 兴化市| 故城县|