大漠駝鈴

          置身浩瀚的沙漠,方向最為重要,希望此blog能向大漠駝鈴一樣,給我方向和指引。
          Java,Php,Shell,Python,服務器運維,大數據,SEO, 網站開發、運維,云服務技術支持,IM服務供應商, FreeSwitch搭建,技術支持等. 技術討論QQ群:428622099
          隨筆 - 238, 文章 - 3, 評論 - 117, 引用 - 0

          導航

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          公告

          本博客提供技術討論QQ群:428622099,希望志同道合的朋友加入群,共同進步和學習。
          如果您覺得本博客還可以,請支持網頁頂部的廣告,謝謝。

          常用鏈接

          留言簿(11)

          隨筆分類(214)

          隨筆檔案(239)

          文章分類(1)

          文章檔案(1)

          相冊

          作品

          • 北京韋爾科技有限公司
          • 北京韋爾科技有限公司是一家從事互聯網相關技術研發型的公司,對外提供互聯網相關技術培訓,產品研發等。
          • 映目圖文直播官網
          • 圖文直播-讓直播更簡單更有效。圖文直播基于文字、圖片、視頻的直播方式,直播可嵌入APP、網站和微信公眾平臺,提供多種方式面向企業個人支持在線直播云服務、遠程部署服務、技術支持服務!
          • 映目官網
          • 映目是一體化自助式全流程的數字會議云平臺,擁有直播、活動、簽到、互動、會務、云攝影子產品,提供線上線下一體化服務,包含會議網站、簽到、互動、直播、數據統計、攝影、攝像、速記、翻譯等全流程的線上線下解決方案,辦活動找映目,高效率、高質量、低成本,映目讓會議活動舉辦更簡單。
          • 映目照片直播官網
          • 映目照片直播,專業的照片直播、圖片直播、云攝影商業紀實攝影服務供應商,5秒數快傳、3分鐘快修即刻呈現,全國拍攝發布會、慶典、年會、展覽、活動、沙龍、派對、講座、課程、會議、文化演出、體育賽事等活動

          搜索

          •  

          積分與排名

          • 積分 - 671244
          • 排名 - 69

          最新評論

          閱讀排行榜

          評論排行榜

          Lucene基本使用介紹

          本文的 目的不在于對Lucene的概念和設計這些進行介紹,僅在于介紹怎么樣去使用Lucene來達到自己想要的幾種常見的全文檢索的需求,如果想深入了解 Lucene的話本文不會帶給你什么收獲的。看完本文后想更深入的了解Lucene請訪問:http://lucene.apache.org

          一. 概述

          隨著系統信息的越來越多,怎么樣從這些信息海洋中撈起自己想要的那一根針就變得非常重要了,全文檢索是通常用于解決此類問題的方案,而Lucene則為實現全文檢索的工具,任何應用都可通過嵌入它來實現全文檢索。


          二. 環境搭建


          lucene.apache.org上下載最新版本的lucene.jar,將此jar作為項目的build path,那么在項目中就可以直接使用lucene了。


          三. 使用說明


          3.1.       基本概念


          這里介紹的主要為在使用中經常碰到一些概念,以大家都比較熟悉的數據庫來進行類比的講解,使用Lucene進行全文檢索的過程有點類似數據庫的這個過程,table---à查詢相應的字段或查詢條件----à返回相應的記錄,首先是IndexWriter,通過它建立相應的索引表,相當于數據庫中的table,在構建此索引表時需指定的為該索引表采用何種方式進行構建,也就是說對于其中的記錄的字段以什么方式來進行格式的劃分,這個在Lucene中稱為AnalyzerLucene提供了幾種環境下使用的AnalyzerSimpleAnalyzerStandardAnalyzerGermanAnalyzer等,其中StandardAnalyzer是經常使用的,因為它提供了對于中文的支持,在表建好后我們就需要往里面插入用于索引的記錄,在Lucene中這個稱為Document,有點類似數據庫中table的一行記錄,記錄中的字段的添加方法,在Lucene中稱為Field,這個和數據庫中基本一樣,對于Field Lucene分為可被索引的,可切分的,不可被切分的,不可被索引的幾種組合類型,通過這幾個元素基本上就可以建立起索引了。在查詢時經常碰到的為另外幾個概念,首先是QueryLucene提供了幾種經常可以用到的QueryTermQueryMultiTermQueryBooleanQueryWildcardQueryPhraseQueryPrefixQueryPhrasePrefixQueryFuzzyQueryRangeQuerySpanQueryQuery其實也就是指對于需要查詢的字段采用什么樣的方式進行查詢,如模糊查詢、語義查詢、短語查詢、范圍查詢、組合查詢等,還有就是QueryParserQueryParser可用于創建不同的Query,還有一個MultiFieldQueryParser支持對于多個字段進行同一關鍵字的查詢,IndexSearcher概念指的為需要對何目錄下的索引文件進行何種方式的分析的查詢,有點象對數據庫的哪種索引表進行查詢并按一定方式進行記錄中字段的分解查詢的概念,通過IndexSearcher以及Query即可查詢出需要的結果,Lucene返回的為Hits.通過遍歷Hits可獲取返回的結果的Document,通過Document則可獲取Field中的相關信息了。


          通過對于上面在建立索引和全文檢索的基本概念的介紹希望能讓你對Lucene建立一定的了解。


          3.2.       全文檢索需求的實現


          索引建立部分的代碼:




          private void createIndex(String indexFilePath) throws Exception{

                  IndexWriter iwriter
          =getWriter(indexFilePath);

                  Document doc
          =new Document();

                  doc.add(Field.Keyword(
          "name","jerry"));

                  doc.add(Field.Text(
          "sender","bluedavy@gmail.com"));

                  doc.add(Field.Text(
          "receiver","google@gmail.com"));

                  doc.add(Field.Text(
          "title","用于索引的標題"));

                  doc.add(Field.UnIndexed(
          "content","不建立索引的內容"));

                  Document doc2
          =new Document();

                  doc2.add(Field.Keyword(
          "name","jerry.lin"));

                  doc2.add(Field.Text(
          "sender","bluedavy@hotmail.com"));

                  doc2.add(Field.Text(
          "receiver","msn@hotmail.com"));

                  doc2.add(Field.Text(
          "title","用于索引的第二個標題"));

                  doc2.add(Field.Text(
          "content","建立索引的內容"));

                  iwriter.addDocument(doc);

                  iwriter.addDocument(doc2);

                  iwriter.optimize();

                  iwriter.close();

              }


              

              
          private IndexWriter getWriter(String indexFilePath) throws Exception{

                  boolean append
          =true;

                  File file
          =new File(indexFilePath+File.separator+"segments");

                  
          if(file.exists())

                      append
          =false

                  
          return new IndexWriter(indexFilePath,analyzer,append);

              }




          3.2.1.       對于某字段的關鍵字的模糊查詢




          Query query=new WildcardQuery(new Term("sender","*davy*"));

                  

                  Searcher searcher
          =new IndexSearcher(indexFilePath);

                  Hits hits
          =searcher.search(query);

                  
          for (int i = 0; i < hits.length(); i++{

                      System.
          out.println(hits.doc(i).get("name"));

                  }




          3.2.2.       對于某字段的關鍵字的語義查詢




          Query query=QueryParser.parse("索引","title",analyzer);

                  

                  Searcher searcher
          =new IndexSearcher(indexFilePath);

                  Hits hits
          =searcher.search(query);

                  
          for (int i = 0; i < hits.length(); i++{

                      System.
          out.println(hits.doc(i).get("name"));

                  }




          3.2.3.       對于多字段的關鍵字的查詢




          Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);

                  

                  Searcher searcher
          =new IndexSearcher(indexFilePath);

                  Hits hits
          =searcher.search(query);

                  
          for (int i = 0; i < hits.length(); i++{

                      System.
          out.println(hits.doc(i).get("name"));

                  }




          3.2.4.       復合查詢(多種查詢條件的綜合查詢)




          Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);

                  Query mquery
          =new WildcardQuery(new Term("sender","bluedavy*"));

                  TermQuery tquery
          =new TermQuery(new Term("name","jerry"));

                  

                  BooleanQuery bquery
          =new BooleanQuery();

                  bquery.add(query,
          true,false);

                  bquery.add(mquery,
          true,false);

                  bquery.add(tquery,
          true,false);

                  

                  Searcher searcher
          =new IndexSearcher(indexFilePath);

                  Hits hits
          =searcher.search(bquery);

                  
          for (int i = 0; i < hits.length(); i++{

                      System.
          out.println(hits.doc(i).get("name"));

                  }




          四. 總結


          相信大家通過上面的說明能知道Lucene的一個基本的使用方法,在全文檢索時建議大家先采用語義時的搜索,先搜索出有意義的內容,之后再進行模糊之類的搜索,^_^,這個還是需要根據搜索的需求才能定了,Lucene還提供了很多其他更好用的方法,這個就等待大家在使用的過程中自己去進一步的摸索了,比如對于Lucene本身提供的Query的更熟練的掌握,對于FilterSorter的使用,自己擴展實現Analyzer,自己實現Query等等,甚至可以去了解一些關于搜索引擎的技術(切詞、索引排序 etc)等等。(來源:BlueDavy之技術Blog)

          posted on 2009-03-03 11:35 草原上的駱駝 閱讀(284) 評論(0)  編輯  收藏 所屬分類: 搜索服務

          主站蜘蛛池模板: 永清县| 恩平市| 文成县| 阿拉尔市| 苍溪县| 龙井市| 卓尼县| 冀州市| 景泰县| 刚察县| 乐业县| 日照市| 临猗县| 新河县| 白朗县| 商丘市| 睢宁县| 莫力| 宜城市| 鄂伦春自治旗| 阜平县| 西丰县| 崇信县| 德惠市| 鄂尔多斯市| 合山市| 东兰县| 米易县| 筠连县| 永宁县| 东城区| 历史| 新巴尔虎右旗| 新兴县| 广南县| 札达县| 上栗县| 东海县| 嫩江县| 九龙城区| 应用必备|