版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、全文檢索技術(shù)Lucene課程計(jì)劃什么是全文檢索,如何實(shí)現(xiàn)全文檢索Lucene實(shí)現(xiàn)全文檢索的流程創(chuàng)建索引查詢索引配置開(kāi)發(fā)環(huán)境入門程序分析器的分析過(guò)程測(cè)試分析器的分詞效果第三方中文分析器索引庫(kù)維護(hù)添加文檔刪除文檔修改文檔索引庫(kù)查詢使用Query子類查詢使用QueryParser查詢什么是全文檢索數(shù)據(jù)分類我們生活中的數(shù)據(jù)總體分為兩種:結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。結(jié)構(gòu)化數(shù)據(jù):指具有固定格式或有限長(zhǎng)度的數(shù)據(jù),如數(shù)據(jù)庫(kù),元數(shù)據(jù)等。非結(jié)構(gòu)化數(shù)據(jù):指不定長(zhǎng)或無(wú)固定格式的數(shù)據(jù),如郵件,word文檔等磁盤(pán)上的文件結(jié)構(gòu)化數(shù)據(jù)搜索常見(jiàn)的結(jié)構(gòu)化數(shù)據(jù)也就是數(shù)據(jù)庫(kù)中的數(shù)據(jù)。在數(shù)據(jù)庫(kù)中搜索很容易實(shí)現(xiàn),通常都是使用sql語(yǔ)句進(jìn)行
2、查詢,而且能很快的得到查詢結(jié)果。為什么數(shù)據(jù)庫(kù)搜索很容易?因?yàn)閿?shù)據(jù)庫(kù)中的數(shù)據(jù)存儲(chǔ)是有規(guī)律的,有行有列而且數(shù)據(jù)格式、數(shù)據(jù)長(zhǎng)度都是固定的。非結(jié)構(gòu)化數(shù)據(jù)查詢方法順序掃描法(Serial Scanning)所謂順序掃描,比如要找內(nèi)容包含某一個(gè)字符串的文件,就是一個(gè)文檔一個(gè)文檔的看,對(duì)于每一個(gè)文檔,從頭看到尾,如果此文檔包含此字符串,則此文檔為我們要找的文件,接著看下一個(gè)文件,直到掃描完所有的文件。如利用windows的搜索也可以搜索文件內(nèi)容,只是相當(dāng)?shù)穆?。全文檢索(Full-text Search)將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來(lái),重新組織,使其變得有一定結(jié)構(gòu),然后對(duì)此有一定結(jié)構(gòu)的數(shù)據(jù)進(jìn)行搜索,從而
3、達(dá)到搜索相對(duì)較快的目的。這部分從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱之索引。例如:字典。字典的拼音表和部首檢字表就相當(dāng)于字典的索引,對(duì)每一個(gè)字的解釋是非結(jié)構(gòu)化的,如果字典沒(méi)有音節(jié)表和部首檢字表,在茫茫辭海中找一個(gè)字只能順序掃描。然而字的某些信息可以提取出來(lái)進(jìn)行結(jié)構(gòu)化處理,比如讀音,就比較結(jié)構(gòu)化,分聲母和韻母,分別只有幾種可以一一列舉,于是將讀音拿出來(lái)按一定的順序排列,每一項(xiàng)讀音都指向此字的詳細(xì)解釋的頁(yè)數(shù)。我們搜索時(shí)按結(jié)構(gòu)化的拼音搜到讀音,然后按其指向的頁(yè)數(shù),便可找到我們的非結(jié)構(gòu)化數(shù)據(jù)也即對(duì)字的解釋。這種先建立索引,再對(duì)索引進(jìn)行搜索的過(guò)程就叫全文檢索(Full-text Search
4、)。雖然創(chuàng)建索引的過(guò)程也是非常耗時(shí)的,但是索引一旦創(chuàng)建就可以多次使用,全文檢索主要處理的是查詢,所以耗時(shí)間創(chuàng)建索引是值得的。如何實(shí)現(xiàn)全文檢索可以使用Lucene實(shí)現(xiàn)全文檢索。Lucene是apache下的一個(gè)開(kāi)放源代碼的全文檢索引擎工具包。提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能。全文檢索的應(yīng)用場(chǎng)景對(duì)于數(shù)據(jù)量大、數(shù)據(jù)結(jié)構(gòu)不固定的數(shù)據(jù)可采用全文檢索方式搜索,比如百度、Google等搜索引擎、論壇站內(nèi)搜索、電商網(wǎng)站站內(nèi)搜索等。Lucene實(shí)現(xiàn)全文檢索的流程索引和搜索流程圖1、綠色表示索引過(guò)程
5、,對(duì)要搜索的原始內(nèi)容進(jìn)行索引構(gòu)建一個(gè)索引庫(kù),索引過(guò)程包括:確定原始內(nèi)容即要搜索的內(nèi)容采集文檔創(chuàng)建文檔分析文檔索引文檔2、紅色表示搜索過(guò)程,從索引庫(kù)中搜索內(nèi)容,搜索過(guò)程包括:用戶通過(guò)搜索界面創(chuàng)建查詢執(zhí)行搜索,從索引庫(kù)搜索渲染搜索結(jié)果創(chuàng)建索引對(duì)文檔索引的過(guò)程,將用戶要搜索的文檔內(nèi)容進(jìn)行索引,索引存儲(chǔ)在索引庫(kù)(index)中。這里我們要搜索的文檔是磁盤(pán)上的文本文件,根據(jù)案例描述:凡是文件名或文件內(nèi)容包括關(guān)鍵字的文件都要找出來(lái),這里要對(duì)文件名和文件內(nèi)容創(chuàng)建索引。獲得原始文檔原始文檔是指要索引和搜索的內(nèi)容。原始內(nèi)容包括互聯(lián)網(wǎng)上的網(wǎng)頁(yè)、數(shù)據(jù)庫(kù)中的數(shù)據(jù)、磁盤(pán)上的文件等。 本案例中的原始內(nèi)容就是磁盤(pán)上的文件,
6、如下圖:從互聯(lián)網(wǎng)上、數(shù)據(jù)庫(kù)、文件系統(tǒng)中等獲取需要搜索的原始信息,這個(gè)過(guò)程就是信息采集,信息采集的目的是為了對(duì)原始內(nèi)容進(jìn)行索引。在Internet上采集信息的軟件通常稱為爬蟲(chóng)或蜘蛛,也稱為網(wǎng)絡(luò)機(jī)器人,爬蟲(chóng)訪問(wèn)互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)頁(yè),將獲取到的網(wǎng)頁(yè)內(nèi)容存儲(chǔ)起來(lái)。本案例我們要獲取磁盤(pán)上文件的內(nèi)容,可以通過(guò)文件流來(lái)讀取文本文件的內(nèi)容,對(duì)于pdf、doc、xls等文件可通過(guò)第三方提供的解析工具讀取文件內(nèi)容,比如Apache POI讀取doc和xls的文件內(nèi)容。創(chuàng)建文檔對(duì)象獲取原始內(nèi)容的目的是為了索引,在索引前需要將原始內(nèi)容創(chuàng)建成文檔(Document),文檔中包括一個(gè)一個(gè)的域(Field),域中存儲(chǔ)內(nèi)容。
7、這里我們可以將磁盤(pán)上的一個(gè)文件當(dāng)成一個(gè)document,Document中包括一些Field(file_name文件名稱、file_path文件路徑、file_size文件大小、file_content文件內(nèi)容),如下圖:Document(文檔)Field(域)Name:file_name(文件名稱)Value:springmvc.txtField(域)Name:file_path(文件路徑)Value:e:/XXXXXX.txtField(域)Name:file_content(文件內(nèi)容)Value:36312Field(域)Name:file_size(文件大?。¬alue:346543其
8、它Field.。注意:每個(gè)Document可以有多個(gè)Field,不同的Document可以有不同的Field,同一個(gè)Document可以有相同的Field(域名和域值都相同)每個(gè)文檔都有一個(gè)唯一的編號(hào),就是文檔id。分析文檔將原始內(nèi)容創(chuàng)建為包含域(Field)的文檔(document),需要再對(duì)域中的內(nèi)容進(jìn)行分析,分析的過(guò)程是經(jīng)過(guò)對(duì)原始文檔提取單詞、將字母轉(zhuǎn)為小寫(xiě)、去除標(biāo)點(diǎn)符號(hào)、去除停用詞等過(guò)程生成最終的語(yǔ)匯單元,可以將語(yǔ)匯單元理解為一個(gè)一個(gè)的單詞。比如下邊的文檔經(jīng)過(guò)分析如下:原文檔內(nèi)容:Lucene is a Java full-text search engine. Lucene is n
9、ot a completeapplication, but rather a code library and API that can easily be usedto add search capabilities to applications.分析后得到的語(yǔ)匯單元:lucene、java、full、search、engine。每個(gè)單詞叫做一個(gè)Term,不同的域中拆分出來(lái)的相同的單詞是不同的term。term中包含兩部分一部分是文檔的域名,另一部分是單詞的內(nèi)容。例如:文件名中包含apache和文件內(nèi)容中包含的apache是不同的term。創(chuàng)建索引對(duì)所有文檔分析得出的語(yǔ)匯單元進(jìn)行索引,索引
10、的目的是為了搜索,最終要實(shí)現(xiàn)只搜索被索引的語(yǔ)匯單元從而找到Document(文檔)。索引庫(kù)Filename:springContent:frameworkContent:providesContent:comprehensiveContent:rogrammingContent:configurationFilename:ModelContent:springDocument1Document2Document3Document4注意:創(chuàng)建索引是對(duì)語(yǔ)匯單元索引,通過(guò)詞語(yǔ)找文檔,這種索引的結(jié)構(gòu)叫倒排索引結(jié)構(gòu)。傳統(tǒng)方法是根據(jù)文件找到該文件的內(nèi)容,在文件內(nèi)容中匹配搜索關(guān)鍵字,這種方法是順序掃描方法,
11、數(shù)據(jù)量大、搜索慢。倒排索引結(jié)構(gòu)是根據(jù)內(nèi)容(詞語(yǔ))找文檔,如下圖: 倒排索引結(jié)構(gòu)也叫反向索引結(jié)構(gòu),包括索引和文檔兩部分,索引即詞匯表,它的規(guī)模較小,而文檔集合較大。查詢索引查詢索引也是搜索的過(guò)程。搜索就是用戶輸入關(guān)鍵字,從索引(index)中進(jìn)行搜索的過(guò)程。根據(jù)關(guān)鍵字搜索索引,根據(jù)索引找到對(duì)應(yīng)的文檔,從而找到要搜索的內(nèi)容(這里指磁盤(pán)上的文件)。 用戶查詢接口全文檢索系統(tǒng)提供用戶搜索的界面供用戶提交搜索的關(guān)鍵字,搜索完成展示搜索結(jié)果。比如:Lucene不提供制作用戶搜索界面的功能,需要根據(jù)自己的需求開(kāi)發(fā)搜索界面。創(chuàng)建查詢用戶輸入查詢關(guān)鍵字執(zhí)行搜索之前需要先構(gòu)建一個(gè)查詢對(duì)象,查詢對(duì)象中可以指定查詢要
12、搜索的Field文檔域、查詢關(guān)鍵字等,查詢對(duì)象會(huì)生成具體的查詢語(yǔ)法,例如:語(yǔ)法 “fileName:lucene”表示要搜索Field域的內(nèi)容為“l(fā)ucene”的文檔執(zhí)行查詢搜索索引過(guò)程:根據(jù)查詢語(yǔ)法在倒排索引詞典表中分別找出對(duì)應(yīng)搜索詞的索引,從而找到索引所鏈接的文檔鏈表。比如搜索語(yǔ)法為“fileName:lucene”表示搜索出fileName域中包含Lucene的文檔。搜索過(guò)程就是在索引上查找域?yàn)閒ileName,并且關(guān)鍵字為L(zhǎng)ucene的term,并根據(jù)term找到文檔id列表。渲染結(jié)果以一個(gè)友好的界面將查詢結(jié)果展示給用戶,用戶根據(jù)搜索結(jié)果找自己想要的信息,為了幫助用戶很快找到自己的結(jié)果
13、,提供了很多展示的效果,比如搜索結(jié)果中將關(guān)鍵字高亮顯示,百度提供的快照等。配置開(kāi)發(fā)環(huán)境Lucene下載Lucene是開(kāi)發(fā)全文檢索功能的工具包,從官方網(wǎng)站下載lucene-7.4.0,并解壓。版本:lucene-7.4.0Jdk要求:1.8以上使用的jar包lucene-core-7.4.0.jarlucene-analyzers-common-7.4.0.jar入門程序需求實(shí)現(xiàn)一個(gè)文件的搜索功能,通過(guò)關(guān)鍵字搜索文件,凡是文件名或文件內(nèi)容包括關(guān)鍵字的文件都需要找出來(lái)。還可以根據(jù)中文詞語(yǔ)進(jìn)行查詢,并且需要支持多個(gè)條件查詢。本案例中的原始內(nèi)容就是磁盤(pán)上的文件,如下圖:創(chuàng)建索引實(shí)現(xiàn)步驟第一步:創(chuàng)建一個(gè)
14、java工程,并導(dǎo)入jar包。第二步:創(chuàng)建一個(gè)indexwriter對(duì)象。指定索引庫(kù)的存放位置Directory對(duì)象指定一個(gè)IndexWriterConfig對(duì)象。第二步:創(chuàng)建document對(duì)象。第三步:創(chuàng)建field對(duì)象,將field添加到document對(duì)象中。第四步:使用indexwriter對(duì)象將document對(duì)象寫(xiě)入索引庫(kù),此過(guò)程進(jìn)行索引創(chuàng)建。并將索引和document對(duì)象寫(xiě)入索引庫(kù)。第五步:關(guān)閉IndexWriter對(duì)象。代碼實(shí)現(xiàn)/創(chuàng)建索引Testpublic void createIndex() throws Exception /指定索引庫(kù)存放的路徑 /D:tempinde
15、x Directory directory = FSDirectory.open(new File(D:tempindex).toPath(); /索引庫(kù)還可以存放到內(nèi)存中 /Directory directory = new RAMDirectory(); /創(chuàng)建indexwriterCofig對(duì)象 IndexWriterConfig config = new IndexWriterConfig(); /創(chuàng)建indexwriter對(duì)象 IndexWriter indexWriter = new IndexWriter(directory, config); /原始文檔的路徑 File dir
16、 = new File(D:tempsearchsource); for (File f : dir.listFiles() /文件名 String fileName = f.getName(); /文件內(nèi)容 String fileContent = FileUtils.readFileToString(f); /文件路徑 String filePath = f.getPath(); /文件的大小 long fileSize = FileUtils.sizeOf(f); /創(chuàng)建文件名域 /第一個(gè)參數(shù):域的名稱 /第二個(gè)參數(shù):域的內(nèi)容 /第三個(gè)參數(shù):是否存儲(chǔ) Field fileNameFiel
17、d = new TextField(filename, fileName, Field.Store.YES); /文件內(nèi)容域 Field fileContentField = new TextField(content, fileContent, Field.Store.YES); /文件路徑域(不分析、不索引、只存儲(chǔ)) Field filePathField = new TextField(path, filePath, Field.Store.YES); /文件大小域 Field fileSizeField = new TextField(size, fileSize + , Field.
18、Store.YES); /創(chuàng)建document對(duì)象 Document document = new Document(); document.add(fileNameField); document.add(fileContentField); document.add(filePathField); document.add(fileSizeField); /創(chuàng)建索引,并寫(xiě)入索引庫(kù) indexWriter.addDocument(document); /關(guān)閉indexwriter indexWriter.close();使用Luke工具查看索引文件我們使用的luke的版本是luke-7.4.
19、0,跟lucene的版本對(duì)應(yīng)的??梢源蜷_(kāi)7.4.0版本的lucene創(chuàng)建的索引庫(kù)。需要注意的是此版本的Luke是jdk9編譯的,所以要想運(yùn)行此工具還需要jdk9才可以。查詢索引實(shí)現(xiàn)步驟第一步:創(chuàng)建一個(gè)Directory對(duì)象,也就是索引庫(kù)存放的位置。第二步:創(chuàng)建一個(gè)indexReader對(duì)象,需要指定Directory對(duì)象。第三步:創(chuàng)建一個(gè)indexsearcher對(duì)象,需要指定IndexReader對(duì)象第四步:創(chuàng)建一個(gè)TermQuery對(duì)象,指定查詢的域和查詢的關(guān)鍵詞。第五步:執(zhí)行查詢。第六步:返回查詢結(jié)果。遍歷查詢結(jié)果并輸出。第七步:關(guān)閉IndexReader對(duì)象代碼實(shí)現(xiàn)/查詢索引庫(kù)Test
20、public void searchIndex() throws Exception /指定索引庫(kù)存放的路徑 /D:tempindex Directory directory = FSDirectory.open(new File(D:tempindex).toPath(); /創(chuàng)建indexReader對(duì)象 IndexReader indexReader = DirectoryReader.open(directory); /創(chuàng)建indexsearcher對(duì)象 IndexSearcher indexSearcher = new IndexSearcher(indexReader); /創(chuàng)建查
21、詢 Query query = new TermQuery(new Term(filename, apache); /執(zhí)行查詢 /第一個(gè)參數(shù)是查詢對(duì)象,第二個(gè)參數(shù)是查詢結(jié)果返回的最大值 TopDocs topDocs = indexSearcher.search(query, 10); /查詢結(jié)果的總條數(shù) System.out.println(查詢結(jié)果的總條數(shù):+ topDocs.totalHits); /遍歷查詢結(jié)果 /topDocs.scoreDocs存儲(chǔ)了document對(duì)象的id for (ScoreDoc scoreDoc : topDocs.scoreDocs) /scoreDoc
22、.doc屬性就是document對(duì)象的id /根據(jù)document的id找到document對(duì)象 Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get(filename); /System.out.println(document.get(content); System.out.println(document.get(path); System.out.println(document.get(size); System.out.println(-); /關(guān)閉indexrea
23、der對(duì)象 indexReader.close();分析器分析器的分詞效果/查看標(biāo)準(zhǔn)分析器的分詞效果Testpublic void testTokenStream() throws Exception /創(chuàng)建一個(gè)標(biāo)準(zhǔn)分析器對(duì)象 Analyzer analyzer = new StandardAnalyzer(); /獲得tokenStream對(duì)象 /第一個(gè)參數(shù):域名,可以隨便給一個(gè) /第二個(gè)參數(shù):要分析的文本內(nèi)容 TokenStream tokenStream = analyzer.tokenStream(test, The Spring Framework provides a compre
24、hensive programming and configuration model.); /添加一個(gè)引用,可以獲得每個(gè)關(guān)鍵詞 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); /添加一個(gè)偏移量的引用,記錄了關(guān)鍵詞的開(kāi)始位置以及結(jié)束位置 OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); /將指針調(diào)整到列表的頭部 tokenStream.reset();
25、 /遍歷關(guān)鍵詞列表,通過(guò)incrementToken方法判斷列表是否結(jié)束 while(tokenStream.incrementToken() /關(guān)鍵詞的起始位置 System.out.println(start- + offsetAttribute.startOffset(); /取關(guān)鍵詞 System.out.println(charTermAttribute); /結(jié)束位置 System.out.println(end- + offsetAttribute.endOffset(); tokenStream.close();中文分析器Lucene自帶中文分詞器StandardAnalyze
26、r:?jiǎn)巫址衷~:就是按照中文一個(gè)字一個(gè)字地進(jìn)行分詞。如:“我愛(ài)中國(guó)”,效果:“我”、“愛(ài)”、“中”、“國(guó)”。SmartChineseAnalyzer對(duì)中文支持較好,但擴(kuò)展性差,擴(kuò)展詞庫(kù),禁用詞庫(kù)和同義詞庫(kù)等不好處理IKAnalyzer使用方法:第一步:把jar包添加到工程中第二步:把配置文件和擴(kuò)展詞典和停用詞詞典添加到classpath下注意:hotword.dic和ext_stopword.dic文件的格式為UTF-8,注意是無(wú)BOM的UTF-8編碼。也就是說(shuō)禁止使用windows記事本編輯擴(kuò)展詞典文件使用EditPlus.exe保存為無(wú)BOM的UTF-8編碼格式,如下圖:使用自定義分析器Te
27、stpublic void addDocument() throws Exception /索引庫(kù)存放路徑 Directory directory = FSDirectory.open(new File(D:tempindex).toPath(); IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer(); /創(chuàng)建一個(gè)indexwriter對(duì)象 IndexWriter indexWriter = new IndexWriter(directory, config);/.索引庫(kù)的維護(hù)索引庫(kù)的添加Field域的屬性是否分析:
28、是否對(duì)域的內(nèi)容進(jìn)行分詞處理。前提是我們要對(duì)域的內(nèi)容進(jìn)行查詢。是否索引:將Field分析后的詞或整個(gè)Field值進(jìn)行索引,只有索引方可搜索到。比如:商品名稱、商品簡(jiǎn)介分析后進(jìn)行索引,訂單號(hào)、身份證號(hào)不用分析但也要索引,這些將來(lái)都要作為查詢條件。是否存儲(chǔ):將Field值存儲(chǔ)在文檔中,存儲(chǔ)在文檔中的Field才可以從Document中獲取比如:商品名稱、訂單號(hào),凡是將來(lái)要從Document中獲取的Field都要存儲(chǔ)。是否存儲(chǔ)的標(biāo)準(zhǔn):是否要將內(nèi)容展示給用戶Field類數(shù)據(jù)類型Analyzed是否分析Indexed是否索引Stored是否存儲(chǔ)說(shuō)明StringField(FieldName, FieldV
29、alue,Store.YES)字符串NYY或N這個(gè)Field用來(lái)構(gòu)建一個(gè)字符串Field,但是不會(huì)進(jìn)行分析,會(huì)將整個(gè)串存儲(chǔ)在索引中,比如(訂單號(hào),姓名等)是否存儲(chǔ)在文檔中用Store.YES或Store.NO決定LongPoint(String name, long. point)Long型 YYN可以使用LongPoint、IntPoint等類型存儲(chǔ)數(shù)值類型的數(shù)據(jù)。讓數(shù)值類型可以進(jìn)行索引。但是不能存儲(chǔ)數(shù)據(jù),如果想存儲(chǔ)數(shù)據(jù)還需要使用StoredField。StoredField(FieldName, FieldValue) 重載方法,支持多種類型NNY這個(gè)Field用來(lái)構(gòu)建不同類型Field不
30、分析,不索引,但要Field存儲(chǔ)在文檔中TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader)字符串或流YYY或N如果是一個(gè)Reader, lucene猜測(cè)內(nèi)容比較多,會(huì)采用Unstored的策略.添加文檔代碼實(shí)現(xiàn)/添加索引Testpublic void addDocument() throws Exception /索引庫(kù)存放路徑 Directory directory = FSDirectory.open(new File(D:tempindex).toPath(); IndexWriterConfig
31、 config = new IndexWriterConfig(new IKAnalyzer(); /創(chuàng)建一個(gè)indexwriter對(duì)象 IndexWriter indexWriter = new IndexWriter(directory, config); /創(chuàng)建一個(gè)Document對(duì)象 Document document = new Document(); /向document對(duì)象中添加域。 /不同的document可以有不同的域,同一個(gè)document可以有相同的域。 document.add(new TextField(filename, 新添加的文檔, Field.Store.YE
32、S); document.add(new TextField(content, 新添加的文檔的內(nèi)容, Field.Store.NO); /LongPoint創(chuàng)建索引 document.add(new LongPoint(size, 1000l); /StoreField存儲(chǔ)數(shù)據(jù) document.add(new StoredField(size, 1000l); /不需要?jiǎng)?chuàng)建索引的就使用StoreField存儲(chǔ) document.add(new StoredField(path, d:/temp/1.txt); /添加文檔到索引庫(kù) indexWriter.addDocument(documen
33、t); /關(guān)閉indexwriter indexWriter.close();索引庫(kù)刪除刪除全部/刪除全部索引Testpublic void deleteAllIndex() throws Exception IndexWriter indexWriter = getIndexWriter();/刪除全部索引indexWriter.deleteAll();/關(guān)閉indexwriterindexWriter.close();說(shuō)明:將索引目錄的索引信息全部刪除,直接徹底刪除,無(wú)法恢復(fù)。此方法慎用!指定查詢條件刪除/根據(jù)查詢條件刪除索引Testpublic void deleteIndexByQue
34、ry() throws Exception IndexWriter indexWriter = getIndexWriter();/創(chuàng)建一個(gè)查詢條件Query query = new TermQuery(new Term(filename, apache);/根據(jù)查詢條件刪除indexWriter.deleteDocuments(query);/關(guān)閉indexwriterindexWriter.close();索引庫(kù)的修改原理就是先刪除后添加。/修改索引庫(kù)Testpublic void updateIndex() throws Exception IndexWriter indexWriter
35、 = getIndexWriter(); /創(chuàng)建一個(gè)Document對(duì)象 Document document = new Document(); /向document對(duì)象中添加域。 /不同的document可以有不同的域,同一個(gè)document可以有相同的域。 document.add(new TextField(filename, 要更新的文檔, Field.Store.YES); document.add(new TextField(content, Lucene 簡(jiǎn)介 Lucene 是一個(gè)基于 Java 的全文信息檢索工具包, + 它不是一個(gè)完整的搜索應(yīng)用程序,而是為你的應(yīng)用程序提供索引
36、和搜索功能。, Field.Store.YES); indexWriter.updateDocument(new Term(content, java), document); /關(guān)閉indexWriter indexWriter.close();Lucene索引庫(kù)查詢對(duì)要搜索的信息創(chuàng)建Query查詢對(duì)象,Lucene會(huì)根據(jù)Query查詢對(duì)象生成最終的查詢語(yǔ)法,類似關(guān)系數(shù)據(jù)庫(kù)Sql語(yǔ)法一樣Lucene也有自己的查詢語(yǔ)法,比如:“name:lucene”表示查詢Field的name為“l(fā)ucene”的文檔信息。可通過(guò)兩種方法創(chuàng)建查詢對(duì)象:1)使用Lucene提供Query子類2)使用QueryP
37、arse解析查詢表達(dá)式TermQueryTermQuery,通過(guò)項(xiàng)查詢,TermQuery不使用分析器所以建議匹配不分詞的Field域查詢,比如訂單號(hào)、分類ID號(hào)等。指定要查詢的域和要查詢的關(guān)鍵詞。/使用Termquery查詢Testpublic void testTermQuery() throws Exception Directory directory = FSDirectory.open(new File(D:tempindex).toPath(); IndexReader indexReader = DirectoryReader.open(directory); IndexSea
38、rcher indexSearcher = new IndexSearcher(indexReader); /創(chuàng)建查詢對(duì)象 Query query = new TermQuery(new Term(content, lucene); /執(zhí)行查詢 TopDocs topDocs = indexSearcher.search(query, 10); /共查詢到的document個(gè)數(shù) System.out.println(查詢結(jié)果總數(shù)量: + topDocs.totalHits); /遍歷查詢結(jié)果 for (ScoreDoc scoreDoc : topDocs.scoreDocs) Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get(filename); /System.out.println(document.get(content); System.out.println(document.get(path); System.out.println(doc
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生產(chǎn)流程再造之路
- 色彩魔法課堂
- 碩士之旅:理論探索與實(shí)踐
- 增材制造與創(chuàng)新設(shè)計(jì):從概念到產(chǎn)品 課件 第4、5章 增材制造前處理及工藝規(guī)劃、增材制造后處理及經(jīng)驗(yàn)總結(jié)
- 農(nóng)業(yè)盛季財(cái)務(wù)透析
- 垃圾分類你我共建
- 邁向明日啟航夢(mèng)想
- 外匯質(zhì)押合同(2篇)
- 2024深圳二手房購(gòu)房定金及房屋維修保養(yǎng)服務(wù)合同3篇
- 標(biāo)準(zhǔn)格式離婚協(xié)議書(shū)
- 雨水、排水管道工程質(zhì)量保證措施
- 荒誕派戲劇演示
- 春節(jié)假日經(jīng)營(yíng)-保險(xiǎn)公司早會(huì)分享節(jié)日營(yíng)銷專題銷售技巧培訓(xùn)PPT模板課件演示文檔幻燈片資料
- 公園景觀改造工程施工組織設(shè)計(jì)方案
- 辦公用品供貨總體服務(wù)方案
- 全國(guó)書(shū)法作品展投稿登記表
- 鏈條功率選用
- 年產(chǎn)30萬(wàn)噸合成氨脫碳工段工藝設(shè)計(jì)
- 塑膠產(chǎn)品成型周期公式及計(jì)算
- (完整版)工地常用英語(yǔ)詞匯
- LM-10Y液晶系列全自動(dòng)振動(dòng)時(shí)效使用說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論