日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.Lucene3.x API分析,Director 索引操作目录,Document,分词器

發(fā)布時間:2024/9/27 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3.Lucene3.x API分析,Director 索引操作目录,Document,分词器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


1??Lucene卡發(fā)包結構分析

包名

功能

org.apache.lucene.analysis

Analysis提供自帶的各種Analyzer

org.apache.lucene.collation

包含collationKeyFiltercollationKeyAnalyzer兩個相同功能的類,將所有token轉為CollationKey,與IndexableBinaryStringTools一起存為term

org.apache.lucene.document

Document包中是Document相關各種數(shù)據(jù)結構,如Document類,Field類等

org.apache.lucene.index

index包中是索引的讀寫操作類,常用的是對索引文件的segment進行寫、合并和優(yōu)化的IndexWriter類和對索引進行讀取和刪除操作的IndexReader

org.apache.lucene.queryParser

queryParser包中是解析查詢語句相關的類(常用的是QueryParser類)

org.apache.lucene.search

檢索管理,根據(jù)查詢條件,檢索得到結果search包中是從索引中進行搜索的各種不同的Query(TermQueryBooleanQuery)和搜索結果集Hits

org.apache.lucene.store

?

store包中是索引的存儲相關類,如Directory類定義了索引文件的存儲結構,FSDirectory是存儲在文件系統(tǒng)(即磁盤)中的索引存儲類,RAMDirectory為存儲在內存中的索引存儲類

org.apache.lucene.util

util包中是公共工具類,例如時間和字符串之間的轉換工具

2??Director 索引操作目錄

FSDirectory :磁盤路徑,在磁盤中創(chuàng)建文件索引庫

RAMDirectory:內存路徑,指在內存中創(chuàng)建文件索引庫

//當前工程index目錄,相對路徑

FSDirectory.open(new File("index"));

//絕對路徑

FSDirectory.open(new File("d:\\index"));

//在類路徑下創(chuàng)建

FSDirectory.open(new File(LuceneTest.class.getResource("/").getFile()));

?? ???

//內存路徑

RAMDirectory directory = new RAMDirectory();

3 ?分詞器(主要要完全搜索的不要分詞,比如當查詢書的書號時不分詞)

Analyzer?分詞器

new StandardAnalyzer(Version.LUCENE_36); //建立標準分詞器,對于漢子采用單自分詞

4? Document索引中文對象,Field文檔內部數(shù)據(jù)信息

每個數(shù)據(jù)對象,對應一個Document對象

對應一個屬性,對應一個Field對象

newField(fieldname,value,Store,Index);? 將數(shù)據(jù)建立索引庫FieldStore決定是否存儲,Index決定是否索引分詞

Store.YES 存儲 Store.NO? 不存儲

Index.NO? 不建立索引

Index.ANALYZED 分詞建立索引?? 保存權重信息

Index.NOT_ANALYZED 不分詞建立索引

Index.ANALYZED_NO_NORMS? 分詞建立索引,不存放權重信息

Index.NOT_ANALYZED_NO_NORMS 不分詞建立索引,不存放權重信息

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ù)標題

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

????? // 查詢滿足結果的前100條數(shù)據(jù)

????? TopDocs topDocs = indexSearcher.search(query, 100);

????? System.out.println("滿足結果記錄條數(shù):" + topDocs.totalHits);

?

????? // 獲取結果

????? ScoreDoc[] scoreDocs = topDocs.scoreDocs;

????? for (int i = 0; i < scoreDocs.length; i++) {

???????? // 先獲得Document下標

???????? 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();

?? }

運行結果: ?

是否分詞, 根據(jù)業(yè)務查找條件決定

是否存儲, 根據(jù)業(yè)務是否需要返回結果數(shù)據(jù) 決定

norm是按照詞頻計算的

問題:Index.ANALYZED 和 Index.ANALYZED_NO_NORMS 區(qū)別 ????

???????? Index.ANALYZED 會保存權重信息

???????? Index.ANALYZED_NO_NORMS 不會保存權重信息

?

權重會影響得分,得分計算排名, 搜索技術搜索結果 一定要進行排序,按照得分

* 不保存norm值,默認按照 1.0 計算

* norm 是按照詞條數(shù) 計算,值<= 1

index.ANALYZED_NO_NORMS 效率會高一些

4 索引創(chuàng)建過程

分詞器Analyzer

目錄Directory

進入索引寫入,必須使用IndexWriter,但是在初始化IndexWriter過程中,對目標索引庫加鎖。

?

當試圖對一個索引庫創(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 還沒有關閉,鎖文件還在

?

問題:如果兩個線程同時對一個索引庫操作怎么辦?---解決辦法:只能使用同一個IndexWriter對象

?

?

總結

以上是生活随笔為你收集整理的3.Lucene3.x API分析,Director 索引操作目录,Document,分词器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。