




免費(fèi)預(yù)覽已結(jié)束,剩余8頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Lucene搜索入門前言搜索即用給定的關(guān)鍵字(key)去內(nèi)容庫(contents)里找到key。Lucene的搜索大概原理是從contents里提取預(yù)定的關(guān)鍵字(preKey)做成一個(gè)索引庫(indexTable)。例:內(nèi)容庫(contents)數(shù)據(jù)庫表productIdNameTitleprice1草魚廣西來賓清水草魚122大米廣西來賓小平陽東南小油粘米33蘋果陜西鳳陽小媽咪蘋果94花生廣西南寧十萬大山野花生99索引庫(IndexTable)多對多規(guī)則,此表只是舉例,真實(shí)生成規(guī)則復(fù)雜,也不是一張表PreKeyids魚,廣西,來賓,清水,草魚1,2,4米,大米,小平陽,東南,油粘米2果,蘋果,陜西,鳳陽,媽咪3花生,十萬大山,野花生4給定key=“廣西”,則搜索出id為1,2,4的記錄。下面具體講Lucen的操作。內(nèi)容步驟:一、 在eclipse中創(chuàng)建一個(gè)Maven工程點(diǎn)擊“finish”,工程創(chuàng)建完成如下:二、 打開配置文件 pom.xml編輯里面的內(nèi)容如下:說明:1) 增加了標(biāo)簽及其內(nèi)部內(nèi)容。2) 每個(gè)內(nèi)容尋找方法,以第一個(gè)內(nèi)容為例,如下:a) 打開 b) 在頭條搜索框輸入lucene搜索c) 搜索結(jié)果如下,選擇含有l(wèi)ucene-core的第一個(gè)結(jié)果點(diǎn)擊進(jìn)入點(diǎn)擊版本號(hào)進(jìn)入:其它幾個(gè)的內(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個(gè)文件。五、 寫java代碼生成索引表(前方中的indexTable)在工程的src/main文件夾下創(chuàng)建生成索引表的工具類實(shí)現(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;/索引表生成對象,可以看成是一個(gè)有規(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)建一個(gè)標(biāo)準(zhǔn)分詞器,所謂分詞器,就是在全內(nèi)容中選擇出關(guān)鍵字(不適用于中文,所以我們選擇建議一個(gè)中文的分詞器)/StandardAnalyzer analyzer = new StandardAnalyzer();SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();/創(chuàng)建索引分析器配置實(shí)例IndexWriterConfig config = new IndexWriterConfig(analyzer);writer = new IndexWriter(dir,config);/讀入等等創(chuàng)建索引的內(nèi)容(因?yàn)槭嵌鄠€(gè)文件所以用listFiles,如果是只有一個(gè)文件 也不會(huì)錯(cuò))File files = new File(contentDir).listFiles();Document document = null;for (File file : files) document = new Document();/創(chuàng)建一個(gè)等待分詞的文檔/可以理解為給索引表添加一個(gè)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)閉寫對象實(shí)例。writer.close();六、 運(yùn)行生成索引表為了看到加載過程,在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ī)則 (建立索引表時(shí)就用的這個(gè))/根據(jù)對索引表搜索的字段和分詞器創(chuàng)建搜索轉(zhuǎn)換器QueryParser parser = new QueryParser(content, analyzer);/根據(jù)搜索關(guān)鍵字,獲取搜索規(guī)則(底層實(shí)現(xiàn)算法,到此處還只是一些設(shè)置,還不是真正耗時(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)識(shí)從搜索器里取得搜索到的文件doc = searcher.doc(score.doc);/顯示搜索到的文件的路徑和名字,通過索引表的字段獲取。System.out.println(搜索到的文件:+doc.get(fullPath)+/+doc.get(fileName);/關(guān)閉讀入文件流reader.close();在工程下的src/test/java文件夾里創(chuàng)建一個(gè)測試類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é)果如下:到此一個(gè)Lucene搜索就完全走通了,但要真實(shí)的工作,還要多學(xué)習(xí)擴(kuò)展,下面再增加一些常用的Lucene應(yīng)用知識(shí)。1) 對索引表的搜索是前面所講重點(diǎn),但對索引表的增刪除也很重要。多了解IndexWriter類的API,如下方法及其重載。writer.addDocument(doc);writer.deleteDocuments(arg0);writer.updateDocument(arg0, arg1);2) 可以給索引表某個(gè)字段的特定值加減權(quán)值(被搜索到的機(jī)率)實(shí)現(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) 對索引表指定字體搜索實(shí)現(xiàn):創(chuàng)建query時(shí)則有所改變Term t=new Term(col,key);/col為索引表字段名,key為搜索關(guān)鍵字Query query=new TermQuery(t);/創(chuàng)建query4)key可以是表達(dá)式(查看文檔),如: String key = “中國”,和邏輯 :與為AND,或?yàn)榭崭瘢?) 指定薦范圍(對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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)設(shè)計(jì)與制造工藝的融合實(shí)踐
- 工業(yè)遺產(chǎn)旅游的開發(fā)與保護(hù)策略
- 工業(yè)設(shè)計(jì)原理與創(chuàng)意實(shí)踐
- 工作壓力下的心理調(diào)適與應(yīng)對策略
- 工作中的創(chuàng)造力提升策略研究
- 工業(yè)領(lǐng)域機(jī)房的綠色節(jié)能技術(shù)應(yīng)用
- 工程學(xué)中的計(jì)算方法研究
- 工作流程優(yōu)化提高工作效率的方法與技巧
- 工廠安全生產(chǎn)與事故預(yù)防培訓(xùn)
- 工程質(zhì)量管理中的風(fēng)險(xiǎn)評(píng)估方法
- 2025年心理健康指導(dǎo)師職業(yè)資格考試試題及答案
- 石油行業(yè)采購物資質(zhì)量事故案例規(guī)律分析課件
- 2024年廣東省揭西縣教師招聘考試《教育學(xué)和心理學(xué)基礎(chǔ)知識(shí)》真題庫及答案
- 2025年新高考2卷(新課標(biāo)Ⅱ卷)英語試卷(含答案解析)
- JG/T 283-2010膨脹?;⒅檩p質(zhì)砂漿
- 電力法規(guī)考試試題及答案
- 2025昆明醫(yī)科大學(xué)海源學(xué)院輔導(dǎo)員考試試題及答案
- 路沿石購銷合同模板
- 誰是消費(fèi)“領(lǐng)頭羊”:人口周期改變消費(fèi)模式221mb
- 2024福建省閩投深海養(yǎng)殖裝備租賃有限責(zé)任公司招聘7人筆試參考題庫附帶答案詳解
- 2025年江西省贛州市八年級(jí)中考模擬預(yù)測生物試題(含答案)
評(píng)論
0/150
提交評(píng)論