cmd
導航
BlogJava
首頁
新隨筆
聯系
聚合
管理
<
2025年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
統計
隨筆 - 13
文章 - 44
評論 - 9
引用 - 0
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(2)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2006年10月 (1)
2006年8月 (2)
2006年6月 (1)
2006年4月 (3)
2006年3月 (3)
2006年2月 (3)
文章分類
j2ee基礎(8)
(rss)
server(5)
(rss)
開源軟件(28)
(rss)
文章檔案
2006年6月 (1)
2006年4月 (9)
2006年3月 (9)
2006年2月 (11)
2005年12月 (1)
2005年11月 (2)
2005年6月 (3)
2005年1月 (1)
2004年12月 (7)
收藏夾
java技術(1)
(rss)
其他blog
(rss)
品味人生
(rss)
點點滴滴
(rss)
other
搞笑
優秀blog
臨海觀潮
(rss)
揚子江
ww
優秀官方
AppFuse
equinox(春秋分)
tapestry wiki
搜索
最新評論
1.?re: Jetty 源碼分析[未登錄]
樓主有做Jetty 虛擬主機經驗嗎?
--Super
2.?re: SVN使用技巧
無圖.................................
--cyt
3.?Unikal'Nyi Kontent
評論內容較長,點擊標題查看
--Unikal'Nyi Kontent
4.?re: 在Spring中集成Hibernate事務
抄來抄去的,沒有意思
--11
5.?re: J2EE 中的安全
Very good, thank you.
--cqusoft
閱讀排行榜
1.?SVN使用技巧(6224)
2.?ejb3 學習第一篇 annotation(1763)
3.?看到這個帖子和對ajax感興趣的網友,謝謝!往http://ajaxcn.org/forum/forums/list.page注冊個帳號,交流一下,共同迎接web2.0(1099)
4.?利用XMLBean輕輕松松讀寫XML(轉)(973)
5.?液晶面板小知識(382)
評論排行榜
1.?SVN使用技巧(2)
2.?利用XMLBean輕輕松松讀寫XML(轉)(2)
3.?看到這個帖子和對ajax感興趣的網友,謝謝!往http://ajaxcn.org/forum/forums/list.page注冊個帳號,交流一下,共同迎接web2.0(1)
4.?ejb3 學習第一篇 annotation(0)
5.?Spring讓Hibernate使用者受益良多(0)
Lucene基本使用介紹
一.? 概述
隨著系統信息的越來越多,怎么樣從這些信息海洋中撈起自己想要的那一根針就變得非常重要了,全文檢索是通常用于解決此類問題的方案,而Lucene則為實現全文檢索的工具,任何應用都可通過嵌入它來實現全文檢索。
二.? 環境搭建
從lucene.apache.org上下載最新版本的lucene.jar,將此jar作為項目的build path,那么在項目中就可以直接使用lucene了。
三.? 使用說明
3.1.?????? 基本概念
這里介紹的主要為在使用中經常碰到一些概念,以大家都比較熟悉的數據庫來進行類比的講解,使用Lucene進行全文檢索的過程有點類似數據庫的這個過程, table---à查詢相應的字段或查詢條件----à返回相應的記錄,首先是IndexWriter,通過它建立相應的索引表,相當于數據庫中的 table,在構建此索引表時需指定的為該索引表采用何種方式進行構建,也就是說對于其中的記錄的字段以什么方式來進行格式的劃分,這個在Lucene中 稱為Analyzer,Lucene提供了幾種環境下使用的Analyzer:SimpleAnalyzer、StandardAnalyzer、 GermanAnalyzer等,其中StandardAnalyzer是經常使用的,因為它提供了對于中文的支持,在表建好后我們就需要往里面插入用于 索引的記錄,在Lucene中這個稱為Document,有點類似數據庫中table的一行記錄,記錄中的字段的添加方法,在Lucene中稱為 Field,這個和數據庫中基本一樣,對于Field Lucene分為可被索引的,可切分的,不可被切分的,不可被索引的幾種組合類型,通過這幾個元素基本上就可以建立起索引了。在查詢時經常碰到的為另外幾 個概念,首先是Query,Lucene提供了幾種經常可以用到的Query:TermQuery、MultiTermQuery、 BooleanQuery、WildcardQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、 FuzzyQuery、RangeQuery、SpanQuery,Query其實也就是指對于需要查詢的字段采用什么樣的方式進行查詢,如模糊查詢、語 義查詢、短語查詢、范圍查詢、組合查詢等,還有就是QueryParser,QueryParser可用于創建不同的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的更熟練的掌握,對于Filter、Sorter的使用,自己擴展實現Analyzer,自己實現Query等 等,甚至可以去了解一些關于搜索引擎的技術(切詞、索引排序 etc)等等。
posted on 2006-04-23 22:31
靜夜思
閱讀(192)
評論(0)
編輯
收藏
所屬分類:
開源軟件
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Hibernate中的事務控制和并發
Lucene基本使用介紹
Mysql 內部函數的使用
apache正在孵化一個優良血統的web framework---shale
有空關注一個國人ajax產品
一個用于J2EE應用程序的Backbase Ajax前端
OSWorkflow 概念
hibernate二級緩存攻略
一個用于J2EE應用程序的Backbase Ajax前端
FreeMarker設計指南
Powered by:
BlogJava
Copyright © 靜夜思
主站蜘蛛池模板:
胶州市
|
靖安县
|
九江市
|
南涧
|
临江市
|
克什克腾旗
|
临泉县
|
双柏县
|
怀来县
|
乌兰浩特市
|
汕头市
|
北流市
|
博野县
|
尚义县
|
屯门区
|
石阡县
|
弥渡县
|
桃江县
|
开封市
|
肥西县
|
怀来县
|
白玉县
|
安达市
|
黔南
|
安多县
|
莱芜市
|
金秀
|
岳阳市
|
深州市
|
宣恩县
|
本溪
|
明溪县
|
轮台县
|
绥棱县
|
临颍县
|
留坝县
|
潍坊市
|
湘潭县
|
东方市
|
云浮市
|
蓝田县
|