3.Lucene3.x API分析,Director 索引操作目录,Document,分词器
1??Lucene卡發(fā)包結(jié)構(gòu)分析
| 包名 | 功能 |
| org.apache.lucene.analysis | Analysis提供自帶的各種Analyzer |
| org.apache.lucene.collation | 包含collationKeyFilter和collationKeyAnalyzer兩個相同功能的類,將所有token轉(zhuǎn)為CollationKey,與IndexableBinaryStringTools一起存為term |
| org.apache.lucene.document | Document包中是Document相關(guān)各種數(shù)據(jù)結(jié)構(gòu),如Document類,Field類等 |
| org.apache.lucene.index | index包中是索引的讀寫操作類,常用的是對索引文件的segment進(jìn)行寫、合并和優(yōu)化的IndexWriter類和對索引進(jìn)行讀取和刪除操作的IndexReader類 |
| org.apache.lucene.queryParser | queryParser包中是解析查詢語句相關(guān)的類(常用的是QueryParser類) |
| org.apache.lucene.search | 檢索管理,根據(jù)查詢條件,檢索得到結(jié)果search包中是從索引中進(jìn)行搜索的各種不同的Query類(如TermQuery、BooleanQuery等)和搜索結(jié)果集Hits類 |
| org.apache.lucene.store ? | store包中是索引的存儲相關(guān)類,如Directory類定義了索引文件的存儲結(jié)構(gòu),FSDirectory是存儲在文件系統(tǒng)(即磁盤)中的索引存儲類,RAMDirectory為存儲在內(nèi)存中的索引存儲類 |
| org.apache.lucene.util | util包中是公共工具類,例如時間和字符串之間的轉(zhuǎn)換工具 |
2??Director 索引操作目錄
FSDirectory :磁盤路徑,在磁盤中創(chuàng)建文件索引庫
RAMDirectory:內(nèi)存路徑,指在內(nèi)存中創(chuàng)建文件索引庫
| //當(dāng)前工程index目錄,相對路徑 FSDirectory.open(new File("index")); //絕對路徑 FSDirectory.open(new File("d:\\index")); //在類路徑下創(chuàng)建 FSDirectory.open(new File(LuceneTest.class.getResource("/").getFile())); ?? ??? //內(nèi)存路徑 RAMDirectory directory = new RAMDirectory(); |
3 ?分詞器(主要要完全搜索的不要分詞,比如當(dāng)查詢書的書號時不分詞)
Analyzer?分詞器
new StandardAnalyzer(Version.LUCENE_36); //建立標(biāo)準(zhǔn)分詞器,對于漢子采用單自分詞
4? Document索引中文對象,Field文檔內(nèi)部數(shù)據(jù)信息
每個數(shù)據(jù)對象,對應(yīng)一個Document對象
對應(yīng)一個屬性,對應(yīng)一個Field對象
newField(fieldname,value,Store,Index);? 將數(shù)據(jù)建立索引庫Field,Store決定是否存儲,Index決定是否索引分詞
| Store.YES 存儲 、Store.NO? 不存儲 Index.NO? 不建立索引 Index.ANALYZED 分詞建立索引?? 保存權(quán)重信息 Index.NOT_ANALYZED 不分詞建立索引 Index.ANALYZED_NO_NORMS? 分詞建立索引,不存放權(quán)重信息 Index.NOT_ANALYZED_NO_NORMS 不分詞建立索引,不存放權(quán)重信息 |
| Document document = new Document(); document.add(new Field("id", article.getId() + "", Store.YES, Index.NOT_ANALYZED));//對于id通常不分詞的 document.add(newField("title",article.getTitle(),Store.YES,Index.ANALYZED)); document.add(new Field("content", article.getContent(), Store.YES,Index.ANALYZED)); |
| @Test ?? // 查詢索引庫,查看norms效果 ?? public void testQuery() throws Exception { ????? // 建立Query對象--根據(jù)標(biāo)題 ????? String queryString = "Lucene"; ????? // 第一個參數(shù),版本號 ????? // 第二個參數(shù),字段 ????? // 第三個參數(shù),分詞器 ????? Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); ????? QueryParser queryParser = new QueryParser(Version.LUCENE_36, "content", ??????????? analyzer); ????? Query query = queryParser.parse(queryString); ? ????? // 根據(jù)Query查找 ????? // 索引目錄位置 ????? Directory directory = FSDirectory.open(new File("index")); ????? IndexSearcher indexSearcher = new IndexSearcher( ??????????? IndexReader.open(directory)); ????? // 查詢滿足結(jié)果的前100條數(shù)據(jù) ????? TopDocs topDocs = indexSearcher.search(query, 100); ????? System.out.println("滿足結(jié)果記錄條數(shù):" + topDocs.totalHits); ? ????? // 獲取結(jié)果 ????? ScoreDoc[] scoreDocs = topDocs.scoreDocs; ????? for (int i = 0; i < scoreDocs.length; i++) { ???????? // 先獲得Document下標(biāo) ???????? int docID = scoreDocs[i].doc; ???????? Document document = indexSearcher.doc(docID); ???????? System.out.println("得分:" + scoreDocs[i].score); ???????? System.out.println("id:" + document.get("id")); ???????? System.out.println("title:" + document.get("title")); ???????? System.out.println("content:" + document.get("content")); ????? } ? ????? indexSearcher.close(); ?? } |
|
|
| 運(yùn)行結(jié)果: ?
|
| 是否分詞, 根據(jù)業(yè)務(wù)查找條件決定 是否存儲, 根據(jù)業(yè)務(wù)是否需要返回結(jié)果數(shù)據(jù) 決定 norm是按照詞頻計算的 問題:Index.ANALYZED 和 Index.ANALYZED_NO_NORMS 區(qū)別 ???? ???????? Index.ANALYZED 會保存權(quán)重信息 ???????? Index.ANALYZED_NO_NORMS 不會保存權(quán)重信息 ? 權(quán)重會影響得分,得分計算排名, 搜索技術(shù)搜索結(jié)果 一定要進(jìn)行排序,按照得分 * 不保存norm值,默認(rèn)按照 1.0 計算 * norm 是按照詞條數(shù) 計算,值<= 1 index.ANALYZED_NO_NORMS 效率會高一些 |
4 索引創(chuàng)建過程
分詞器Analyzer
目錄Directory
進(jìn)入索引寫入,必須使用IndexWriter,但是在初始化IndexWriter過程中,對目標(biāo)索引庫加鎖。
?
當(dāng)試圖對一個索引庫創(chuàng)建多個IndexWriter時,報異常
???????? org.apache.lucene.util.SetOnce$AlreadySetException:The object cannot be set twice!?
?????????????????? *使用同一 indexWriterConfig 兩次
???????? org.apache.lucene.store.LockObtainFailedException:Lock obtain timed out:NativeFSLock@D:\work\javaee20130408\lucene3_day1\index\write.lock
?????????????????? *試圖創(chuàng)建第二個IndexWriter ,第一個IndexWriter 還沒有關(guān)閉,鎖文件還在
?
問題:如果兩個線程同時對一個索引庫操作怎么辦?---解決辦法:只能使用同一個IndexWriter對象
?
?
總結(jié)
以上是生活随笔為你收集整理的3.Lucene3.x API分析,Director 索引操作目录,Document,分词器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.Lucene3.6.2包介绍,第一个
- 下一篇: 家常辣子肉的做法?