![Lucene5.4搜索入門.docx_第1頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/7/4cbeb3d7-4428-42f2-8067-8bed7fc26c01/4cbeb3d7-4428-42f2-8067-8bed7fc26c011.gif)
![Lucene5.4搜索入門.docx_第2頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/7/4cbeb3d7-4428-42f2-8067-8bed7fc26c01/4cbeb3d7-4428-42f2-8067-8bed7fc26c012.gif)
![Lucene5.4搜索入門.docx_第3頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/7/4cbeb3d7-4428-42f2-8067-8bed7fc26c01/4cbeb3d7-4428-42f2-8067-8bed7fc26c013.gif)
![Lucene5.4搜索入門.docx_第4頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/7/4cbeb3d7-4428-42f2-8067-8bed7fc26c01/4cbeb3d7-4428-42f2-8067-8bed7fc26c014.gif)
![Lucene5.4搜索入門.docx_第5頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/7/4cbeb3d7-4428-42f2-8067-8bed7fc26c01/4cbeb3d7-4428-42f2-8067-8bed7fc26c015.gif)
免費預(yù)覽已結(jié)束,剩余8頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Lucene搜索入門前言搜索即用給定的關(guān)鍵字(key)去內(nèi)容庫(contents)里找到key。Lucene的搜索大概原理是從contents里提取預(yù)定的關(guān)鍵字(preKey)做成一個索引庫(indexTable)。例:內(nèi)容庫(contents)數(shù)據(jù)庫表productIdNameTitleprice1草魚廣西來賓清水草魚122大米廣西來賓小平陽東南小油粘米33蘋果陜西鳳陽小媽咪蘋果94花生廣西南寧十萬大山野花生99索引庫(IndexTable)多對多規(guī)則,此表只是舉例,真實生成規(guī)則復(fù)雜,也不是一張表PreKeyids魚,廣西,來賓,清水,草魚1,2,4米,大米,小平陽,東南,油粘米2果,蘋果,陜西,鳳陽,媽咪3花生,十萬大山,野花生4給定key=“廣西”,則搜索出id為1,2,4的記錄。下面具體講Lucen的操作。內(nèi)容步驟:一、 在eclipse中創(chuàng)建一個Maven工程點擊“finish”,工程創(chuàng)建完成如下:二、 打開配置文件 pom.xml編輯里面的內(nèi)容如下:說明:1) 增加了標(biāo)簽及其內(nèi)部內(nèi)容。2) 每個內(nèi)容尋找方法,以第一個內(nèi)容為例,如下:a) 打開 b) 在頭條搜索框輸入lucene搜索c) 搜索結(jié)果如下,選擇含有l(wèi)ucene-core的第一個結(jié)果點擊進(jìn)入點擊版本號進(jìn)入:其它幾個的內(nèi)容一樣的尋找方法。注意版本(當(dāng)前我用lucene 5.4.1)三、 修改工程默認(rèn)的JDK版本,默認(rèn)的是JDK1.5,修改成JDK1.7以上,我電腦安裝JDK1.8所以修改成JDK1.8。(JDK1.8就是JDK8,同理JDK1.5是JDK5,叫法不同而已)操作:對工程名“Lucene”右鍵Build Pathconfigure Build Path四、 準(zhǔn)備數(shù)據(jù)(前言中的contents)在D盤下的LuceneData文件夾里準(zhǔn)備了5個文件。五、 寫java代碼生成索引表(前方中的indexTable)在工程的src/main文件夾下創(chuàng)建生成索引表的工具類實現(xiàn)CreateIndexTable.java類package com.zhc.lucene;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.nio.file.Paths;import .smart.SmartChineseAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.StringField;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.FSDirectory;public class CreateIndexTable private IndexWriter writer;/索引表生成對象,可以看成是一個有規(guī)則的輸出流對象/* * 構(gòu)造方法 * param contentDir 等待創(chuàng)建索引的內(nèi)容路徑 * param indexTableDir 索引表保存的路徑 * throws IOException */public CreateIndexTable(String contentDir,String indexTableDir) throws IOException/讀取內(nèi)容FSDirectory dir = FSDirectory.open(Paths.get(indexTableDir);/創(chuàng)建一個標(biāo)準(zhǔn)分詞器,所謂分詞器,就是在全內(nèi)容中選擇出關(guān)鍵字(不適用于中文,所以我們選擇建議一個中文的分詞器)/StandardAnalyzer analyzer = new StandardAnalyzer();SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();/創(chuàng)建索引分析器配置實例IndexWriterConfig config = new IndexWriterConfig(analyzer);writer = new IndexWriter(dir,config);/讀入等等創(chuàng)建索引的內(nèi)容(因為是多個文件所以用listFiles,如果是只有一個文件 也不會錯)File files = new File(contentDir).listFiles();Document document = null;for (File file : files) document = new Document();/創(chuàng)建一個等待分詞的文檔/可以理解為給索引表添加一個content字段,讀內(nèi)容為從file文件內(nèi)容里提取的關(guān)鍵字,不保存文檔內(nèi)容進(jìn)表document.add(new TextField(content, new FileReader(file);/為索引表增加fileName字段,內(nèi)容為文件名,保存文件名進(jìn)索引表document.add(new StringField(fileName, file.getName(),Field.Store.YES);/為索引表增加fullPath字段,內(nèi)容為文件全路徑,保存文件路徑到索引表document.add(new StringField(fullPath, file.getCanonicalPath(),Field.Store.YES);/寫索引表對象把定義好規(guī)則的文檔寫入索引表writer.addDocument(document);/寫完索引表,關(guān)閉寫對象實例。writer.close();六、 運行生成索引表為了看到加載過程,在for循環(huán)里加了一行代碼:System.out.println(加載的文件 :+file.getCanonicalPath()+/+file.getName();用luke查看生成的索引表如下:七、 寫查詢類LuceneSearch.javapackage com.zhc.lucene;import java.nio.file.Paths;import .smart.SmartChineseAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.queryparser.classic.QueryParser;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.FSDirectory;public class LuceneSearch /* * 構(gòu)造器 * param indexDir 索引表的位置 * param key 查詢關(guān)鍵字 * throws Exception */public LuceneSearch(String indexDir,String key)throws Exception/建立索引表文件路徑FSDirectory directory = FSDirectory.open(Paths.get(indexDir);/建立讀入索引文件對象DirectoryReader reader = DirectoryReader.open(directory);/生成搜索器,將用它來操作搜索IndexSearcher searcher = new IndexSearcher(reader);/生成分詞搜索規(guī)則(用什么規(guī)則生成的索引表,就用什么規(guī)則去搜索索引表)/StandardAnalyzer anaylzer = new StandardAnalyzer();/通用標(biāo)準(zhǔn)分詞規(guī)則SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();/中文分詞規(guī)則 (建立索引表時就用的這個)/根據(jù)對索引表搜索的字段和分詞器創(chuàng)建搜索轉(zhuǎn)換器QueryParser parser = new QueryParser(content, analyzer);/根據(jù)搜索關(guān)鍵字,獲取搜索規(guī)則(底層實現(xiàn)算法,到此處還只是一些設(shè)置,還不是真正耗時的搜索工作)Query query = parser.parse(key);/開始搜索工作,根據(jù)以上設(shè)置的搜索規(guī)則,搜索出前30條數(shù)據(jù)。TopDocs results = searcher.search(query, 30);/顯示搜索結(jié)果Document doc = null;for (ScoreDoc score : results.scoreDocs) /根據(jù)文件標(biāo)識從搜索器里取得搜索到的文件doc = searcher.doc(score.doc);/顯示搜索到的文件的路徑和名字,通過索引表的字段獲取。System.out.println(搜索到的文件:+doc.get(fullPath)+/+doc.get(fileName);/關(guān)閉讀入文件流reader.close();在工程下的src/test/java文件夾里創(chuàng)建一個測試類LuceneSearchTest.javapackage com.zhc.lucene;import org.junit.Test;public class LuceneSearchTest Testpublic void search(String args) String indexDir = D:LuceneIndex;String key = 正者;try new LuceneSearch(indexDir, key); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();搜索結(jié)果如下:到此一個Lucene搜索就完全走通了,但要真實的工作,還要多學(xué)習(xí)擴展,下面再增加一些常用的Lucene應(yīng)用知識。1) 對索引表的搜索是前面所講重點,但對索引表的增刪除也很重要。多了解IndexWriter類的API,如下方法及其重載。writer.addDocument(doc);writer.deleteDocuments(arg0);writer.updateDocument(arg0, arg1);2) 可以給索引表某個字段的特定值加減權(quán)值(被搜索到的機率)實現(xiàn):如更新fileName字段的權(quán)限代碼修改如下:/為索引表增加fileName字段,內(nèi)容為文件名,保存文件名進(jìn)索引表StringField fileNameField = new StringField(fileName, file.getName(),Field.Store.YES);if(file.getName().contains(呂氏) fileNameField.setBoost(1.2f);/默認(rèn)值為1,大于1則更優(yōu)先被搜索到,小于1于反之。document.add(fileNameField);3) 對索引表指定字體搜索實現(xiàn):創(chuàng)建query時則有所改變Term t=new Term(col,key);/col為索引表字段名,key為搜索關(guān)鍵字Query query=new TermQuery(t);/創(chuàng)建query4)key可以是表達(dá)式(查看文檔),如: String key = “中國”,和邏輯 :與為AND,或為空格,4) 指定薦范圍(對fileName搜索從a字符開始b結(jié)束)TermRangeQuery query=new TermRangeQuery(fileName, new BytesRef(b.getBytes(), new BytesRef(c.getBytes(), true, true);5) 指定數(shù)字范圍(對字段為數(shù)字的才可以用數(shù)字范圍,如id,本次數(shù)據(jù)沒數(shù)字類型)NumericRangeQuery query=NumericRangeQuery.newIntRange(id, 1, 2, true, true);6) 指定前綴(對fileName是a開頭的)PrefixQuery query=new PrefixQuery(new Term(fileName,a);7) 多條件(query的構(gòu)造有所不同,多注意)NumericRangeQuery query1=NumericRangeQuery.newIntRange(id, 1, 2, true, true);PrefixQuery query2=new PrefixQuery(new Term(city,a);BooleanQuery.Builder query=new BooleanQuery.Builder();query.add(query1,BooleanClause.Occur.MUST);/MUST為和其它條件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年雙頭螺柱項目投資價值分析報告
- 2025年標(biāo)準(zhǔn)軸承項目可行性研究報告
- 二零二五年編劇助理及場記職務(wù)聘用協(xié)議書13篇
- 2025至2030年六帶燙平機項目投資價值分析報告
- 2025年度內(nèi)控制度培訓(xùn)與執(zhí)行指導(dǎo)服務(wù)合同
- 二零二五年度企業(yè)貸款股東動產(chǎn)抵押擔(dān)保合同范本
- 2025年全球及中國人形機器人無框力矩電機行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國工業(yè)一體式觸控平板電腦行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球后裝載機卡車行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球3D 多傳感器測量機行業(yè)調(diào)研及趨勢分析報告
- 耶魯綜合抽動嚴(yán)重程度量表正式版
- 2024年浙江省公務(wù)員錄用考試《行測》題(A類)
- 2024版《安全生產(chǎn)法》考試題庫附答案(共90題)
- 疥瘡病人的護(hù)理
- 2024年江西省中考英語試題含解析
- 2024版《糖尿病健康宣教》課件
- 公務(wù)員2012年國考《申論》真題卷及答案(地市級)
- 新員工三級安全教育考試試題參考答案
- 35kV輸變電工程(變電站、輸配電線路建設(shè))技術(shù)方案
- 數(shù)學(xué)史簡介課件可編輯全文
- 化學(xué)廢水水池清理施工方案
評論
0/150
提交評論