Lucene基本使用介紹

          今天用了下Lucene,發(fā)現(xiàn)網(wǎng)上雖然也有不少介紹它的文檔,不過(guò)很多都偏向介紹概念呀、設(shè)計(jì)或者是一些更為深入的東西,對(duì)于其入門(mén)使用的介紹性的文檔并不多,就寫(xiě)了這么一篇。

          Lucene基本使用介紹

           

          本文的目的不在于對(duì)Lucene的概念和設(shè)計(jì)這些進(jìn)行介紹,僅在于介紹怎么樣去使用Lucene來(lái)達(dá)到自己想要的幾種常見(jiàn)的全文檢索的需求,如果想深入了解Lucene的話本文不會(huì)帶給你什么收獲的。看完本文后想更深入的了解Lucene請(qǐng)?jiān)L問(wèn):http://lucene.apache.org

           

          一.  概述

          隨著系統(tǒng)信息的越來(lái)越多,怎么樣從這些信息海洋中撈起自己想要的那一根針就變得非常重要了,全文檢索是通常用于解決此類(lèi)問(wèn)題的方案,而Lucene則為實(shí)現(xiàn)全文檢索的工具,任何應(yīng)用都可通過(guò)嵌入它來(lái)實(shí)現(xiàn)全文檢索。

          二.  環(huán)境搭建

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

          三.  使用說(shuō)明

          3.1.       基本概念

          這里介紹的主要為在使用中經(jīng)常碰到一些概念,以大家都比較熟悉的數(shù)據(jù)庫(kù)來(lái)進(jìn)行類(lèi)比的講解,使用Lucene進(jìn)行全文檢索的過(guò)程有點(diǎn)類(lèi)似數(shù)據(jù)庫(kù)的這個(gè)過(guò)程,table---à查詢(xún)相應(yīng)的字段或查詢(xún)條件----à返回相應(yīng)的記錄,首先是IndexWriter,通過(guò)它建立相應(yīng)的索引表,相當(dāng)于數(shù)據(jù)庫(kù)中的table,在構(gòu)建此索引表時(shí)需指定的為該索引表采用何種方式進(jìn)行構(gòu)建,也就是說(shuō)對(duì)于其中的記錄的字段以什么方式來(lái)進(jìn)行格式的劃分,這個(gè)在Lucene中稱(chēng)為AnalyzerLucene提供了幾種環(huán)境下使用的AnalyzerSimpleAnalyzer、StandardAnalyzer、GermanAnalyzer等,其中StandardAnalyzer是經(jīng)常使用的,因?yàn)樗峁┝藢?duì)于中文的支持,在表建好后我們就需要往里面插入用于索引的記錄,在Lucene中這個(gè)稱(chēng)為Document,有點(diǎn)類(lèi)似數(shù)據(jù)庫(kù)中table的一行記錄,記錄中的字段的添加方法,在Lucene中稱(chēng)為Field,這個(gè)和數(shù)據(jù)庫(kù)中基本一樣,對(duì)于Field Lucene分為可被索引的,可切分的,不可被切分的,不可被索引的幾種組合類(lèi)型,通過(guò)這幾個(gè)元素基本上就可以建立起索引了。在查詢(xún)時(shí)經(jīng)常碰到的為另外幾個(gè)概念,首先是Query,Lucene提供了幾種經(jīng)??梢杂玫降?/SPAN>QueryTermQuery、MultiTermQueryBooleanQuery、WildcardQueryPhraseQuery、PrefixQueryPhrasePrefixQuery、FuzzyQuery、RangeQuery、SpanQueryQuery其實(shí)也就是指對(duì)于需要查詢(xún)的字段采用什么樣的方式進(jìn)行查詢(xún),如模糊查詢(xún)、語(yǔ)義查詢(xún)、短語(yǔ)查詢(xún)、范圍查詢(xún)、組合查詢(xún)等,還有就是QueryParser,QueryParser可用于創(chuàng)建不同的Query,還有一個(gè)MultiFieldQueryParser支持對(duì)于多個(gè)字段進(jìn)行同一關(guān)鍵字的查詢(xún),IndexSearcher概念指的為需要對(duì)何目錄下的索引文件進(jìn)行何種方式的分析的查詢(xún),有點(diǎn)象對(duì)數(shù)據(jù)庫(kù)的哪種索引表進(jìn)行查詢(xún)并按一定方式進(jìn)行記錄中字段的分解查詢(xún)的概念,通過(guò)IndexSearcher以及Query即可查詢(xún)出需要的結(jié)果,Lucene返回的為Hits.通過(guò)遍歷Hits可獲取返回的結(jié)果的Document,通過(guò)Document則可獲取Field中的相關(guān)信息了。

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

          3.2.       全文檢索需求的實(shí)現(xiàn)

          索引建立部分的代碼:

          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","用于索引的標(biāo)題"));

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

                  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","用于索引的第二個(gè)標(biāo)題"));

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

                  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.       對(duì)于某字段的關(guān)鍵字的模糊查詢(xún)

          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.       對(duì)于某字段的關(guān)鍵字的語(yǔ)義查詢(xún)

          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.       對(duì)于多字段的關(guān)鍵字的查詢(xún)

          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.       復(fù)合查詢(xún)(多種查詢(xún)條件的綜合查詢(xún))

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

                  }


          四.  總結(jié)

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

          posted on 2005-06-07 22:16 BlueDavy 閱讀(10918) 評(píng)論(9)  編輯  收藏 所屬分類(lèi): Java

          評(píng)論

          # re: Lucene基本使用介紹 2006-01-20 16:49 mars

          good  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2006-01-20 16:50 mas

          good!!!  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2006-03-17 17:27 lucene

          很有收獲,謝謝  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2006-03-18 12:22 求知

          很不錯(cuò)!!googd!
            回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2006-04-01 15:20 zdy

          很好的帖子 謝樓主!  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2006-05-29 11:18 bluebaby

          感謝樓主  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2007-10-15 13:29 lisa

          thanks!!1  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹 2007-12-02 12:20 luguo

          THanks  回復(fù)  更多評(píng)論   

          # re: Lucene基本使用介紹[未登錄](méi) 2009-03-25 11:14 Egg

          太感謝啦!??!  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2005年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統(tǒng)計(jì)

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 合作市| 平陆县| 嘉善县| 崇文区| 肇东市| 苍山县| 英超| 广安市| 永寿县| 平谷区| 上杭县| 吉水县| 长泰县| 杨浦区| 诏安县| 唐海县| 漾濞| 三亚市| 远安县| 枝江市| 马公市| 庆城县| 天门市| 阳原县| 红原县| 娄烦县| 黄冈市| 榆中县| 伊春市| 汉源县| 盐山县| 云和县| 平塘县| 宁安市| 金溪县| 宁都县| 连江县| 海安县| 克东县| 海林市| 泊头市|