




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Lucene搜索入門前言搜索即用給定的關鍵字(key)去內容庫(contents)里找到key。Lucene的搜索大概原理是從contents里提取預定的關鍵字(preKey)做成一個索引庫(indexTable)。例:內容庫(contents)數(shù)據(jù)庫表productIdNameTitleprice1草魚廣西來賓清水草魚122大米廣西來賓小平陽東南小油粘米33蘋果陜西鳳陽小媽咪蘋果94花生廣西南寧十萬大山野花生99索引庫(IndexTable)多對多規(guī)則,此表只是舉例,真實生成規(guī)則復雜,也不是一張表PreKeyids魚,廣西,來賓,清水,草魚1,2,4米,大米,小平陽,東南,油粘米2果,蘋果,陜西,鳳陽,媽咪3花生,十萬大山,野花生4給定key=“廣西”,則搜索出id為1,2,4的記錄。下面具體講Lucen的操作。內容步驟:一、 在eclipse中創(chuàng)建一個Maven工程點擊“finish”,工程創(chuàng)建完成如下:二、 打開配置文件 pom.xml編輯里面的內容如下:說明:1) 增加了標簽及其內部內容。2) 每個內容尋找方法,以第一個內容為例,如下:a) 打開 b) 在頭條搜索框輸入lucene搜索c) 搜索結果如下,選擇含有l(wèi)ucene-core的第一個結果點擊進入點擊版本號進入:其它幾個的內容一樣的尋找方法。注意版本(當前我用lucene 5.4.1)三、 修改工程默認的JDK版本,默認的是JDK1.5,修改成JDK1.7以上,我電腦安裝JDK1.8所以修改成JDK1.8。(JDK1.8就是JDK8,同理JDK1.5是JDK5,叫法不同而已)操作:對工程名“Lucene”右鍵Build Pathconfigure Build Path四、 準備數(shù)據(jù)(前言中的contents)在D盤下的LuceneData文件夾里準備了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ī)則的輸出流對象/* * 構造方法 * param contentDir 等待創(chuàng)建索引的內容路徑 * param indexTableDir 索引表保存的路徑 * throws IOException */public CreateIndexTable(String contentDir,String indexTableDir) throws IOException/讀取內容FSDirectory dir = FSDirectory.open(Paths.get(indexTableDir);/創(chuàng)建一個標準分詞器,所謂分詞器,就是在全內容中選擇出關鍵字(不適用于中文,所以我們選擇建議一個中文的分詞器)/StandardAnalyzer analyzer = new StandardAnalyzer();SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();/創(chuàng)建索引分析器配置實例IndexWriterConfig config = new IndexWriterConfig(analyzer);writer = new IndexWriter(dir,config);/讀入等等創(chuàng)建索引的內容(因為是多個文件所以用listFiles,如果是只有一個文件 也不會錯)File files = new File(contentDir).listFiles();Document document = null;for (File file : files) document = new Document();/創(chuàng)建一個等待分詞的文檔/可以理解為給索引表添加一個content字段,讀內容為從file文件內容里提取的關鍵字,不保存文檔內容進表document.add(new TextField(content, new FileReader(file);/為索引表增加fileName字段,內容為文件名,保存文件名進索引表document.add(new StringField(fileName, file.getName(),Field.Store.YES);/為索引表增加fullPath字段,內容為文件全路徑,保存文件路徑到索引表document.add(new StringField(fullPath, file.getCanonicalPath(),Field.Store.YES);/寫索引表對象把定義好規(guī)則的文檔寫入索引表writer.addDocument(document);/寫完索引表,關閉寫對象實例。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 /* * 構造器 * param indexDir 索引表的位置 * param key 查詢關鍵字 * 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();/通用標準分詞規(guī)則SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();/中文分詞規(guī)則 (建立索引表時就用的這個)/根據(jù)對索引表搜索的字段和分詞器創(chuàng)建搜索轉換器QueryParser parser = new QueryParser(content, analyzer);/根據(jù)搜索關鍵字,獲取搜索規(guī)則(底層實現(xiàn)算法,到此處還只是一些設置,還不是真正耗時的搜索工作)Query query = parser.parse(key);/開始搜索工作,根據(jù)以上設置的搜索規(guī)則,搜索出前30條數(shù)據(jù)。TopDocs results = searcher.search(query, 30);/顯示搜索結果Document doc = null;for (ScoreDoc score : results.scoreDocs) /根據(jù)文件標識從搜索器里取得搜索到的文件doc = searcher.doc(score.doc);/顯示搜索到的文件的路徑和名字,通過索引表的字段獲取。System.out.println(搜索到的文件:+doc.get(fullPath)+/+doc.get(fileName);/關閉讀入文件流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();搜索結果如下:到此一個Lucene搜索就完全走通了,但要真實的工作,還要多學習擴展,下面再增加一些常用的Lucene應用知識。1) 對索引表的搜索是前面所講重點,但對索引表的增刪除也很重要。多了解IndexWriter類的API,如下方法及其重載。writer.addDocument(doc);writer.deleteDocuments(arg0);writer.updateDocument(arg0, arg1);2) 可以給索引表某個字段的特定值加減權值(被搜索到的機率)實現(xiàn):如更新fileName字段的權限代碼修改如下:/為索引表增加fileName字段,內容為文件名,保存文件名進索引表StringField fileNameField = new StringField(fileName, file.getName(),Field.Store.YES);if(file.getName().contains(呂氏) fileNameField.setBoost(1.2f);/默認值為1,大于1則更優(yōu)先被搜索到,小于1于反之。document.add(fileNameField);3) 對索引表指定字體搜索實現(xiàn):創(chuàng)建query時則有所改變Term t=new Term(col,key);/col為索引表字段名,key為搜索關鍵字Query query=new TermQuery(t);/創(chuàng)建query4)key可以是表達式(查看文檔),如: String key = “中國”,和邏輯 :與為AND,或為空格,4) 指定薦范圍(對fileName搜索從a字符開始b結束)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的構造有所不同,多注意)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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇北四市生物試題及答案
- 2025年鎮(zhèn)江房地產市場區(qū)域分化現(xiàn)狀與投資機遇深度分析報告
- 2025年主題公園市場發(fā)展態(tài)勢報告:品牌競爭力評估與行業(yè)趨勢
- 班組長工作述職報告
- 網(wǎng)絡直播行業(yè)自律規(guī)范與內容監(jiān)管效果評估研究報告
- 安全工程師考試內容解析試題及答案
- 電商綠色物流智能化與自動化技術應用報告
- 紅棋考試題及答案
- 工會考試知識試題及答案
- 教育資源整合的反思試題及答案
- 【MOOC】大學體育(二)-華中科技大學 中國大學慕課MOOC答案
- 律師實務訓練材料
- 《社會職業(yè)大調查》 第一課時(教案)-三年級勞動北師大版
- 橋架支架計算表
- Unit3OnthemoveDevelopingideasRunningintoabetterlife教學設計-高一下學期外研版英語
- 生物航煤行業(yè)前景
- YS/T 819-2012電子薄膜用高純銅濺射靶材
- GB/T 3961-1993纖維增強塑料術語
- 學校項目工程監(jiān)理規(guī)劃
- 高考語文答題思維導圖
- 設備檢維修作業(yè)票填寫模板
評論
0/150
提交評論