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