生活随笔
收集整理的這篇文章主要介紹了
一个例子学懂搜索引擎(lucene)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://www.vifir.com/html/20080827/1703937.html
一個例子學(xué)懂搜索引擎(lucene)
來源:
javaeye 作者:
phz50 2008-08-27 16:44:40.0網(wǎng)友評論:
0條 點(diǎn)擊:
8996
其實(shí),lucene是一個很容易上手的搜索引擎框架,傳統(tǒng)的搜索引擎,涉及到爬蟲,也就是爬取網(wǎng)頁,然后對網(wǎng)頁進(jìn)行加工,也就是索引,最后用于搜索,lucene這個框架可以很方便的幫你做到后面兩個步驟,也就是索引和搜索!本文嘗試通過一個例子,使大家掌握lucene的使用核心方法,包括分詞、索引、搜索不同的目錄、搜索不同的域,希望大家通過這個實(shí)例,對lucene和搜索引擎能有比較全面的認(rèn)識!
其實(shí),lucene是一個很容易上手的搜索引擎框架,傳統(tǒng)的搜索引擎,涉及到爬蟲,也就是爬取網(wǎng)頁,然后對網(wǎng)頁進(jìn)行加工,也就是索引,最后用于搜 索,lucene這個框架可以很方便的幫你做到后面兩個步驟,也就是索引和搜索!本文嘗試通過一個例子,使大家掌握lucene的使用核心方法,包括分 詞、索引、搜索不同的目錄、搜索不同的域,希望大家通過這個實(shí)例,對lucene和搜索引擎能有比較全面的認(rèn)識!
下面是這個例子的代碼:
phz.LuceneTest.java
package?phz;?import?org.apache.lucene.analysis.standard.StandardAnalyzer;import?org.apache.lucene.document.Document;import?org.apache.lucene.document.Field;import?org.apache.lucene.index.IndexWriter;import?org.apache.lucene.queryParser.MultiFieldQueryParser;import?org.apache.lucene.search.BooleanClause;import?org.apache.lucene.search.Hits;import?org.apache.lucene.search.IndexSearcher;import?org.apache.lucene.search.MultiSearcher;import?org.apache.lucene.search.Query;??*?這個實(shí)例包含了lucene所有核心用法?*?*public?class?LuceneTest?{?????public?static?void?main(String[]?args)?{????????try?{????????????LuceneTest?luceneTest?=?new?LuceneTest();????????????????????????luceneTest.index();????????????????????????luceneTest.search("中國?金牌");????????}?catch?(Exception?e)?{????????????e.printStackTrace();????????}????????System.out.println("ok");????}?????public?void?index()?throws?Exception?{????????????????IndexWriter?writer1?=?new?IndexWriter("d:\\save\\",????????????????new?StandardAnalyzer(),?true);????????writer1.close();??????????????????*?往創(chuàng)建的初始化索引中添加索引內(nèi)容,StandardAnalyzer表示用lucene自帶的標(biāo)準(zhǔn)分詞機(jī)制,?????????*?false表示不覆蓋原來該目錄的索引,細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn),?這句話和上面的那句就這個false不一樣?????????*/????????IndexWriter?writer2?=?new?IndexWriter("d:\\save\\",????????????????new?StandardAnalyzer(),?false);????????????????Document?doc1?=?new?Document();?????????????????*?創(chuàng)建一個域ArticleTitle,并往這個域里面添加內(nèi)容?"Field.Store.YES"表示域里面的內(nèi)容將被存儲到索引?????????*?"Field.Index.TOKENIZED"表示域里面的內(nèi)容將被索引,以便用來搜索?????????*/????????Field?field1?=?new?Field("ArticleTitle",?"北京2008年奧運(yùn)會",?Field.Store.YES,????????????????Field.Index.TOKENIZED);????????????????doc1.add(field1);????????????????Field?field2?=?new?Field("ArticleText",?"這是一屆創(chuàng)造奇跡、超越夢想的奧運(yùn)會.......",????????????????Field.Store.YES,?Field.Index.TOKENIZED);????????doc1.add(field2);????????????????????????writer2.addDocument(doc1);?????????????????Document?doc2?=?new?Document();????????field1?=?new?Field("ArticleTitle",?"中國獲得全球贊譽(yù)",?Field.Store.YES,????????????????Field.Index.TOKENIZED);????????doc2.add(field1);????????field2?=?new?Field("ArticleText",?"中國所取得的金牌總數(shù)排行榜的榜首........",????????????????Field.Store.YES,?Field.Index.TOKENIZED);????????doc2.add(field2);?????????writer2.addDocument(doc2);??????????????????????????writer2.close();????}?????public?void?search(String?serchString)?throws?Exception?{????????????????IndexSearcher?indexSearcher?=?new?IndexSearcher("d:\\save\\");????????????????IndexSearcher?indexSearchers[]?=?{?indexSearcher?};????????????????String[]?fields?=?{?"ArticleTitle",?"ArticleText"?};????????????????BooleanClause.Occur[]?clauses?=?{?BooleanClause.Occur.SHOULD,????????????????BooleanClause.Occur.SHOULD?};?????????????????*?MultiFieldQueryParser表示多個域解析,?????????*?同時可以解析含空格的字符串,如果我們搜索"中國?金牌",根據(jù)前面的索引,顯然搜到的是第二份文件?????????*/????????Query?query?=?MultiFieldQueryParser.parse(serchString,?fields,?clauses,????????????????new?StandardAnalyzer());????????????????MultiSearcher?searcher?=?new?MultiSearcher(indexSearchers);????????????????Hits?h?=?searcher.search(query);????????????????for?(int?i?=?0;?i?<?h.length();?i++)?{????????????????????????System.out.println(h.doc(i).get("ArticleTitle"));????????????????????????System.out.println(h.doc(i).get("ArticleText"));????????}????????????????searcher.close();????}} package phz;import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.Query;/*** 這個實(shí)例包含了lucene所有核心用法* * @author panhuizi* */
public class LuceneTest {public static void main(String[] args) {try {LuceneTest luceneTest = new LuceneTest();// 創(chuàng)建索引luceneTest.index();// 在索引所在目錄下搜索"中國 金牌"luceneTest.search("中國 金牌");} catch (Exception e) {e.printStackTrace();}System.out.println("ok");}public void index() throws Exception {/* 創(chuàng)建索引初始化,執(zhí)行這些語句將創(chuàng)建或清空d:\\save\\目錄下所有索引 */IndexWriter writer1 = new IndexWriter("d:\\save\\",new StandardAnalyzer(), true);writer1.close();/** 往創(chuàng)建的初始化索引中添加索引內(nèi)容,StandardAnalyzer表示用lucene自帶的標(biāo)準(zhǔn)分詞機(jī)制,* false表示不覆蓋原來該目錄的索引,細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn), 這句話和上面的那句就這個false不一樣*/IndexWriter writer2 = new IndexWriter("d:\\save\\",new StandardAnalyzer(), false);/* 創(chuàng)建一份文件 */Document doc1 = new Document();/** 創(chuàng)建一個域ArticleTitle,并往這個域里面添加內(nèi)容 "Field.Store.YES"表示域里面的內(nèi)容將被存儲到索引* "Field.Index.TOKENIZED"表示域里面的內(nèi)容將被索引,以便用來搜索*/Field field1 = new Field("ArticleTitle", "北京2008年奧運(yùn)會", Field.Store.YES,Field.Index.TOKENIZED);/* 往文件里添加這個域 */doc1.add(field1);/* 同理:創(chuàng)建另外一個域ArticleText,并往這個域里面添加內(nèi)容 */Field field2 = new Field("ArticleText", "這是一屆創(chuàng)造奇跡、超越夢想的奧運(yùn)會.......",Field.Store.YES, Field.Index.TOKENIZED);doc1.add(field2);// 在這里還可以添加其他域/* 添加這份文件到索引 */writer2.addDocument(doc1);/* 同理:創(chuàng)建第二份文件 */Document doc2 = new Document();field1 = new Field("ArticleTitle", "中國獲得全球贊譽(yù)", Field.Store.YES,Field.Index.TOKENIZED);doc2.add(field1);field2 = new Field("ArticleText", "中國所取得的金牌總數(shù)排行榜的榜首........",Field.Store.YES, Field.Index.TOKENIZED);doc2.add(field2);writer2.addDocument(doc2);// 在這里可以添加其他文件/* 關(guān)閉 */writer2.close();}public void search(String serchString) throws Exception {/* 創(chuàng)建一個搜索,搜索剛才創(chuàng)建的d:\\save\\目錄下的索引 */IndexSearcher indexSearcher = new IndexSearcher("d:\\save\\");/* 在這里我們只需要搜索一個目錄 */IndexSearcher indexSearchers[] = { indexSearcher };/* 我們需要搜索兩個域"ArticleTitle", "ArticleText"里面的內(nèi)容 */String[] fields = { "ArticleTitle", "ArticleText" };/* 下面這個表示要同時搜索這兩個域,而且只要一個域里面有滿足我們搜索的內(nèi)容就行 */BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD };/** MultiFieldQueryParser表示多個域解析,* 同時可以解析含空格的字符串,如果我們搜索"中國 金牌",根據(jù)前面的索引,顯然搜到的是第二份文件*/Query query = MultiFieldQueryParser.parse(serchString, fields, clauses,new StandardAnalyzer());/* Multisearcher表示多目錄搜索,在這里我們只有一個目錄 */MultiSearcher searcher = new MultiSearcher(indexSearchers);/* 開始搜索 */Hits h = searcher.search(query);/* 把搜索出來的所有文件打印出來 */for (int i = 0; i < h.length(); i++) {/* 打印出文件里面ArticleTitle域里面的內(nèi)容 */System.out.println(h.doc(i).get("ArticleTitle"));/* 打印出文件里面ArticleText域里面的內(nèi)容 */System.out.println(h.doc(i).get("ArticleText"));}/* 關(guān)閉 */searcher.close();}
}
附件中每一步驟都有比較詳細(xì)的說明!
關(guān)于lucene,有任何疑問,都可以提出來,大家一起交流!
- luceneTest.rar (594.2 KB)
- 描述: 這個實(shí)例包含了lucene所有核心用法
- 下載次數(shù): 375
轉(zhuǎn)載自:http://phz50.javaeye.com/blog/232429
其實(shí),lucene是一個很容易上手的搜索引擎框架,傳統(tǒng)的搜索引擎,涉及到爬蟲,也就是爬取網(wǎng)頁,然后對網(wǎng)頁進(jìn)行加工,也就是索引,最后用于搜 索,lucene這個框架可以很方便的幫你做到后面兩個步驟,也就是索引和搜索!本文嘗試通過一個例子,使大家掌握lucene的使用核心方法,包括分 詞、索引、搜索不同的目錄、搜索不同的域,希望大家通過這個實(shí)例,對lucene和搜索引擎能有比較全面的認(rèn)識!
下面是這個例子的代碼:
phz.LuceneTest.java
package?phz;?import?org.apache.lucene.analysis.standard.StandardAnalyzer;import?org.apache.lucene.document.Document;import?org.apache.lucene.document.Field;import?org.apache.lucene.index.IndexWriter;import?org.apache.lucene.queryParser.MultiFieldQueryParser;import?org.apache.lucene.search.BooleanClause;import?org.apache.lucene.search.Hits;import?org.apache.lucene.search.IndexSearcher;import?org.apache.lucene.search.MultiSearcher;import?org.apache.lucene.search.Query;??*?這個實(shí)例包含了lucene所有核心用法?*?*public?class?LuceneTest?{?????public?static?void?main(String[]?args)?{????????try?{????????????LuceneTest?luceneTest?=?new?LuceneTest();????????????????????????luceneTest.index();????????????????????????luceneTest.search("中國?金牌");????????}?catch?(Exception?e)?{????????????e.printStackTrace();????????}????????System.out.println("ok");????}?????public?void?index()?throws?Exception?{????????????????IndexWriter?writer1?=?new?IndexWriter("d:\\save\\",????????????????new?StandardAnalyzer(),?true);????????writer1.close();??????????????????*?往創(chuàng)建的初始化索引中添加索引內(nèi)容,StandardAnalyzer表示用lucene自帶的標(biāo)準(zhǔn)分詞機(jī)制,?????????*?false表示不覆蓋原來該目錄的索引,細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn),?這句話和上面的那句就這個false不一樣?????????*/????????IndexWriter?writer2?=?new?IndexWriter("d:\\save\\",????????????????new?StandardAnalyzer(),?false);????????????????Document?doc1?=?new?Document();?????????????????*?創(chuàng)建一個域ArticleTitle,并往這個域里面添加內(nèi)容?"Field.Store.YES"表示域里面的內(nèi)容將被存儲到索引?????????*?"Field.Index.TOKENIZED"表示域里面的內(nèi)容將被索引,以便用來搜索?????????*/????????Field?field1?=?new?Field("ArticleTitle",?"北京2008年奧運(yùn)會",?Field.Store.YES,????????????????Field.Index.TOKENIZED);????????????????doc1.add(field1);????????????????Field?field2?=?new?Field("ArticleText",?"這是一屆創(chuàng)造奇跡、超越夢想的奧運(yùn)會.......",????????????????Field.Store.YES,?Field.Index.TOKENIZED);????????doc1.add(field2);????????????????????????writer2.addDocument(doc1);?????????????????Document?doc2?=?new?Document();????????field1?=?new?Field("ArticleTitle",?"中國獲得全球贊譽(yù)",?Field.Store.YES,????????????????Field.Index.TOKENIZED);????????doc2.add(field1);????????field2?=?new?Field("ArticleText",?"中國所取得的金牌總數(shù)排行榜的榜首........",????????????????Field.Store.YES,?Field.Index.TOKENIZED);????????doc2.add(field2);?????????writer2.addDocument(doc2);??????????????????????????writer2.close();????}?????public?void?search(String?serchString)?throws?Exception?{????????????????IndexSearcher?indexSearcher?=?new?IndexSearcher("d:\\save\\");????????????????IndexSearcher?indexSearchers[]?=?{?indexSearcher?};????????????????String[]?fields?=?{?"ArticleTitle",?"ArticleText"?};????????????????BooleanClause.Occur[]?clauses?=?{?BooleanClause.Occur.SHOULD,????????????????BooleanClause.Occur.SHOULD?};?????????????????*?MultiFieldQueryParser表示多個域解析,?????????*?同時可以解析含空格的字符串,如果我們搜索"中國?金牌",根據(jù)前面的索引,顯然搜到的是第二份文件?????????*/????????Query?query?=?MultiFieldQueryParser.parse(serchString,?fields,?clauses,????????????????new?StandardAnalyzer());????????????????MultiSearcher?searcher?=?new?MultiSearcher(indexSearchers);????????????????Hits?h?=?searcher.search(query);????????????????for?(int?i?=?0;?i?<?h.length();?i++)?{????????????????????????System.out.println(h.doc(i).get("ArticleTitle"));????????????????????????System.out.println(h.doc(i).get("ArticleText"));????????}????????????????searcher.close();????}} package phz;import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.Query;/*** 這個實(shí)例包含了lucene所有核心用法* * @author panhuizi* */
public class LuceneTest {public static void main(String[] args) {try {LuceneTest luceneTest = new LuceneTest();// 創(chuàng)建索引luceneTest.index();// 在索引所在目錄下搜索"中國 金牌"luceneTest.search("中國 金牌");} catch (Exception e) {e.printStackTrace();}System.out.println("ok");}public void index() throws Exception {/* 創(chuàng)建索引初始化,執(zhí)行這些語句將創(chuàng)建或清空d:\\save\\目錄下所有索引 */IndexWriter writer1 = new IndexWriter("d:\\save\\",new StandardAnalyzer(), true);writer1.close();/** 往創(chuàng)建的初始化索引中添加索引內(nèi)容,StandardAnalyzer表示用lucene自帶的標(biāo)準(zhǔn)分詞機(jī)制,* false表示不覆蓋原來該目錄的索引,細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn), 這句話和上面的那句就這個false不一樣*/IndexWriter writer2 = new IndexWriter("d:\\save\\",new StandardAnalyzer(), false);/* 創(chuàng)建一份文件 */Document doc1 = new Document();/** 創(chuàng)建一個域ArticleTitle,并往這個域里面添加內(nèi)容 "Field.Store.YES"表示域里面的內(nèi)容將被存儲到索引* "Field.Index.TOKENIZED"表示域里面的內(nèi)容將被索引,以便用來搜索*/Field field1 = new Field("ArticleTitle", "北京2008年奧運(yùn)會", Field.Store.YES,Field.Index.TOKENIZED);/* 往文件里添加這個域 */doc1.add(field1);/* 同理:創(chuàng)建另外一個域ArticleText,并往這個域里面添加內(nèi)容 */Field field2 = new Field("ArticleText", "這是一屆創(chuàng)造奇跡、超越夢想的奧運(yùn)會.......",Field.Store.YES, Field.Index.TOKENIZED);doc1.add(field2);// 在這里還可以添加其他域/* 添加這份文件到索引 */writer2.addDocument(doc1);/* 同理:創(chuàng)建第二份文件 */Document doc2 = new Document();field1 = new Field("ArticleTitle", "中國獲得全球贊譽(yù)", Field.Store.YES,Field.Index.TOKENIZED);doc2.add(field1);field2 = new Field("ArticleText", "中國所取得的金牌總數(shù)排行榜的榜首........",Field.Store.YES, Field.Index.TOKENIZED);doc2.add(field2);writer2.addDocument(doc2);// 在這里可以添加其他文件/* 關(guān)閉 */writer2.close();}public void search(String serchString) throws Exception {/* 創(chuàng)建一個搜索,搜索剛才創(chuàng)建的d:\\save\\目錄下的索引 */IndexSearcher indexSearcher = new IndexSearcher("d:\\save\\");/* 在這里我們只需要搜索一個目錄 */IndexSearcher indexSearchers[] = { indexSearcher };/* 我們需要搜索兩個域"ArticleTitle", "ArticleText"里面的內(nèi)容 */String[] fields = { "ArticleTitle", "ArticleText" };/* 下面這個表示要同時搜索這兩個域,而且只要一個域里面有滿足我們搜索的內(nèi)容就行 */BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD };/** MultiFieldQueryParser表示多個域解析,* 同時可以解析含空格的字符串,如果我們搜索"中國 金牌",根據(jù)前面的索引,顯然搜到的是第二份文件*/Query query = MultiFieldQueryParser.parse(serchString, fields, clauses,new StandardAnalyzer());/* Multisearcher表示多目錄搜索,在這里我們只有一個目錄 */MultiSearcher searcher = new MultiSearcher(indexSearchers);/* 開始搜索 */Hits h = searcher.search(query);/* 把搜索出來的所有文件打印出來 */for (int i = 0; i < h.length(); i++) {/* 打印出文件里面ArticleTitle域里面的內(nèi)容 */System.out.println(h.doc(i).get("ArticleTitle"));/* 打印出文件里面ArticleText域里面的內(nèi)容 */System.out.println(h.doc(i).get("ArticleText"));}/* 關(guān)閉 */searcher.close();}
}
附件中每一步驟都有比較詳細(xì)的說明!
關(guān)于lucene,有任何疑問,都可以提出來,大家一起交流!
- luceneTest.rar (594.2 KB)
- 描述: 這個實(shí)例包含了lucene所有核心用法
- 下載次數(shù): 375
轉(zhuǎn)載自:http://phz50.javaeye.com/blog/232429
?
總結(jié)
以上是生活随笔為你收集整理的一个例子学懂搜索引擎(lucene)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。