這篇文章主要為大家展示了“Lucene如何實(shí)現(xiàn)索引和查詢”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Lucene如何實(shí)現(xiàn)索引和查詢”這篇文章吧。
10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有雙峰免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
0引言
隨著萬維網(wǎng)的發(fā)展和大數(shù)據(jù)時(shí)代的到來,每天都有大量的數(shù)字化信息在生產(chǎn)、存儲(chǔ)、傳遞和轉(zhuǎn)化,如何從大量的信息中以一定的方式找到滿足自己需求的信息,使之有序化并加以利用成為一大難題。全文檢索技術(shù)是現(xiàn)如今最普遍的信息查詢應(yīng)用,生活中利用搜索引擎,在博客論壇中查找信息,這些搜索的核心原理就是本文要實(shí)現(xiàn)的全文檢索技術(shù)。隨著文檔信息數(shù)字化的實(shí)現(xiàn),將信息有效存儲(chǔ)并及時(shí)準(zhǔn)確的提取是每一個(gè)公司、企業(yè)和單位要做好的基礎(chǔ)。針對(duì)英文的全文檢索已經(jīng)有很多成熟的理論和方法,開放源代碼的全文檢索引擎Lucene 是Apache 軟件基金會(huì)Jakarta 項(xiàng)目組的一個(gè)子項(xiàng)目,它的目的是為軟件開發(fā)人員提供一個(gè)簡單易用的工具包,方便在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能。Lucene不支持中文,但是目前已有很多開源的中文分詞器可以對(duì)中文內(nèi)容進(jìn)行索引,本文在研究Lucene核心原理的基礎(chǔ)上,分別實(shí)現(xiàn)了對(duì)中英文網(wǎng)頁的爬取和檢索。
1 Lucene介紹
1.1 lucene簡介
Lucene是一個(gè)用Java寫的全文檢索引擎工具包,實(shí)現(xiàn)構(gòu)造了索引和搜索兩大核心功能,并且兩者相互獨(dú)立,這使得開發(fā)人員可以方便擴(kuò)展,Lucene提供了豐富的API , 可以與存儲(chǔ)在索引中的信息方便的交互。需要說明的是它并不是一個(gè)完整的全文檢索應(yīng)用, 而是為應(yīng)用程序提供索引和搜索功能。即若想讓Lucene 真正起作用, 還需在其基礎(chǔ)上做一些必要的二次開發(fā)。
Lucene的結(jié)構(gòu)設(shè)計(jì)與數(shù)據(jù)庫的設(shè)計(jì)較為相似,但Lucene的索引與數(shù)據(jù)庫有著極大的不同。數(shù)據(jù)庫和Lucene建立索引都是為了查找方便,但是數(shù)據(jù)庫僅僅針對(duì)部分字段進(jìn)行建立,且需要把數(shù)據(jù)轉(zhuǎn)化為格式化信息,并予以保存。而全文檢索是將全部信息按照一定方式進(jìn)行索引。兩種檢索的不同和相似如表1-1所示。
表1-1:數(shù)據(jù)庫檢索與Lucene檢索對(duì)比
比較項(xiàng) | Lucene檢索 | 數(shù)據(jù)庫檢索 |
數(shù)據(jù)檢索 | 從Lucene的索引文件中檢出 | 由數(shù)據(jù)庫索引檢索記錄 |
索引結(jié)構(gòu) | Document(文檔) | Record(記錄) |
查詢結(jié)果 | Hit:滿足關(guān)系的文檔組成 | 查詢結(jié)果集:包含關(guān)鍵字的記錄組成 |
全文檢索 | 支持 | 不支持 |
模糊查詢 | 支持 | 不支持 |
結(jié)果排序 | 設(shè)置權(quán)重,進(jìn)行相關(guān)性排序 | 不能排序 |
1.2 lucene總體結(jié)構(gòu)
Lucene軟件包的發(fā)布形式是一個(gè)JAR文件,版本更新較快且版本差距較大,本文使用的是5.3.1的版本,主要使用的子包如表1-2所示。
表1-2:子包和功能
包名 | 功能 |
Org .apache.lucene .analysis | 分詞 |
Org .apache.lucene .document | 對(duì)索引管理的文檔 |
Org .apache.lucene .index | 索引操作,包括增加、刪除等 |
Org .apache.lucene .queryParser | 查詢器,構(gòu)造檢索表達(dá)式 |
Org .apache.lucene .search | 檢索管理 |
Org .apache.lucene .store | 數(shù)據(jù)存儲(chǔ)管理 |
Org .apache.lucene .util | 公共類 |
1.3 lucene架構(gòu)設(shè)計(jì)
Lucene功能非常強(qiáng)大,但從根本上來說,主要包括兩塊:一是從文本內(nèi)容切分詞后索引入庫;二是根據(jù)查詢條件返回結(jié)果,即建立索引和進(jìn)行查詢兩部分。
如圖1-1所示,本文拋出外部接口以及信息來源,重點(diǎn)對(duì)網(wǎng)頁爬取的文本內(nèi)容進(jìn)行索引和查詢 。
圖1-1:Lucene的架構(gòu)設(shè)計(jì)
2 JDK的安裝和環(huán)境變量的配置
1.jdk的下載:
在oracle官網(wǎng)下載符合系統(tǒng)版本的壓縮包,網(wǎng)址如下。點(diǎn)擊安裝,根據(jù)提示進(jìn)行安裝,在安裝過程中會(huì)提示是否安裝jre,點(diǎn)擊是。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.設(shè)置環(huán)境變量:
(1)右鍵計(jì)算機(jī)=》屬性=》高級(jí)系統(tǒng)設(shè)置=》環(huán)境變量=》系統(tǒng)變量=》新建=》JAVA_HOME:安裝路徑
(2)Path中新增=》%JAVA_HOME%\bin
3.測試是否成功:
開始=》運(yùn)行=》CMD 回車 在彈出的 DOS 窗口內(nèi)
輸入:java -version 會(huì)出現(xiàn)版本信息,
輸入: javac出現(xiàn) javac 的用法信息
出現(xiàn)如圖2-1所示為成功。
圖2-1:cmd命令框測試java配置
3 編寫Java代碼實(shí)現(xiàn)對(duì)網(wǎng)頁內(nèi)容的獲取
因?yàn)長ucene針對(duì)不同語言要使用不同的分詞器,英文使用標(biāo)準(zhǔn)分詞器,中文選擇使用smartcn分詞器。在獲取網(wǎng)頁的時(shí)候,先獲取網(wǎng)頁存為html文件,在html中由于標(biāo)簽 的干擾,會(huì)對(duì)檢索效果產(chǎn)生影響,因此需要對(duì)html標(biāo)簽進(jìn)行剔除,并將文本內(nèi)容轉(zhuǎn)為txt文件進(jìn)行保存。中英文除了分詞器不同,其他基本一致,因此之后的代碼和實(shí)驗(yàn)結(jié)果演 示會(huì)選擇任一。本文選取五十篇中文故事和英文故事的網(wǎng)頁為例。
具體代碼設(shè)計(jì)如下圖:Url2Html.java將輸入網(wǎng)址的網(wǎng)頁轉(zhuǎn)存為html文件,Html2Txt.java文件實(shí)現(xiàn)html文檔標(biāo)簽的去除,轉(zhuǎn)存為txt文檔。具體代碼如圖3-1和3-2。
public void way(String filePath,String url) throws Exception{ File dest = new File(filePath);//建立文件 InputStream is;//接收字節(jié)輸入流 FileOutputStream fos = new FileOutputStream(dest);//字節(jié)輸出流 URL wangzhi = new URL(url);//設(shè)定網(wǎng)址URL is = wangzhi.openStream(); BufferedInputStream bis = new BufferedInputStream(is);//為字節(jié)輸入流加緩沖 BufferedOutputStream bos = new BufferedOutputStream(fos);//為字節(jié)輸出流加緩沖 /* * 對(duì)字節(jié)進(jìn)行讀取 */ int length; byte[] bytes = new byte[1024*20]; while((length = bis.read(bytes, 0, bytes.length)) != -1){ fos.write(bytes, 0, length); } /* * 關(guān)閉緩沖流和輸入輸出流 */ bos.close(); fos.close(); bis.close(); is.close(); }
public String getBody(String val){ String zyf = val.replaceAll("</?[^>]+>", ""); //剔出<html>的標(biāo)簽 return zyf; } public void writeTxt(String Str,String writePath) { File writename = new File(writePath); try { writename.createNewFile(); BufferedWriter out = new BufferedWriter(new FileWriter(writename)); out.write(Str); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } }
以童話故事《笨狼上學(xué)》的網(wǎng)頁為例,文檔路徑設(shè)為”E:\work \lucene \test \data \html”和”E:\work\lucene\test\data\txt”,在每一次讀取網(wǎng)頁的時(shí)候需要設(shè)定的兩個(gè)參數(shù)為文件命名filename和獲取目標(biāo)網(wǎng)址url。新建一個(gè)main函數(shù),實(shí)現(xiàn)對(duì)兩個(gè)方法的調(diào)用。具體實(shí)現(xiàn)如圖3-3所示:
public static void main(String[] args) { String filename = "jingdizhi";//文件名字 String url = "http://www.51test.net/show/8072125.html";//需要爬取的網(wǎng)頁url String filePath = "E:\\work\\lucene\\test\\data\\html\\"+filename+".html";//寫出html的文件路徑+文件名 String writePath = "E:\\work\\lucene\\test\\data\\txt\\"+filename+".txt";//寫出txt的文件路徑+文件名 Url2Html url2html = new Url2Html(); try { url2html.way(filePath,url); } catch (Exception e) { e.printStackTrace(); } Html2Txt html2txt = new Html2Txt(); String read=html2txt.readfile(filePath);//讀取html文件 String txt = html2txt.getBody(read);//去除html標(biāo)簽 System.out.println(txt); try { html2txt.writeTxt(txt,writePath); } catch (Exception e) { e.printStackTrace(); } }
執(zhí)行程序后,分別在兩個(gè)文件夾中建立”笨狼上學(xué).html”和”笨狼上學(xué).txt”。
4 建立索引
索引和查詢的基本原理如下:
建立索引:搜索引擎的索引其實(shí)就是實(shí)現(xiàn)“單詞-文檔矩陣”的具體數(shù)據(jù)結(jié)構(gòu)。也是進(jìn)行全文檢索的第一步,lucene提供IndexWriter類進(jìn)行索引的管理,主要包括add()、delete()、update()。還有對(duì)權(quán)值的設(shè)定,通過不同索引權(quán)值的設(shè)定,可以在搜索的時(shí)候根據(jù)相關(guān)性大小進(jìn)行返回。
進(jìn)行搜索:原本的直接搜索是針對(duì)文檔進(jìn)行順序檢索,在建立索引之后,可以通過對(duì)索引的查找以找到索引詞在文檔中出現(xiàn)的位置,然后返回索引項(xiàng)所對(duì)的文檔中的位置和詞。Lucene提供IndexSearcher類進(jìn)行對(duì)文檔的檢索,檢索形式主要分為兩類,第一類是Term,針對(duì)單個(gè)詞項(xiàng)的檢索;第二類是Parser,可以自定義構(gòu)造檢索表達(dá)式,有較多的檢索形式,具體的方法會(huì)在之后進(jìn)行實(shí)現(xiàn)的演示。
4.1 實(shí)驗(yàn)環(huán)境
本PC機(jī)采用windows 10x64系統(tǒng),8G內(nèi)存,256G固態(tài)硬盤。開發(fā)環(huán)境為Myeclipse 10,jdk版本為1.8。在實(shí)驗(yàn)過程中,因?yàn)椴糠终Z法的轉(zhuǎn)變,若干Class采用1.6版本實(shí)現(xiàn)。
4.2 建立索引
建立索引庫就是往索引庫添加一條條索引記錄,Lucene為添加一條索引記錄提供了接口,添加索引。
主要用到了“寫索引器”、“文檔”、“域”這3 個(gè)類。要建立索引,首先要構(gòu)造一個(gè)Document 文檔對(duì)象,確定Document的各個(gè)域,這類似于關(guān)系型數(shù)據(jù)庫中表結(jié)構(gòu)的建立,Document相當(dāng)于表中的一個(gè)記錄行,域相當(dāng)于一行中的列,在Lucene 中針對(duì)不同域的屬性和數(shù)據(jù)輸出的需求,對(duì)域還可以選擇不同的索引/存儲(chǔ)字段規(guī)則,在本實(shí)驗(yàn)中,文件名fileName、文件路徑fullPath和文本內(nèi)容content作為Document 的域。
IndexWriter 負(fù)責(zé)接收新加入的文檔,并寫入索引庫中。在創(chuàng)建“寫索引器”IndexWriter 時(shí)需要指定所使用的語言分析器。建立索引分為兩個(gè)類別,第一:不加權(quán)索引;第二:加權(quán)索引。
public Indexer(String indexDir)throws Exception{ Directory dir=FSDirectory.open(Paths.get(indexDir)); Analyzer analyzer=new StandardAnalyzer(); // 標(biāo)準(zhǔn)分詞器 //SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer(); IndexWriterConfig iwc=new IndexWriterConfig(analyzer); writer=new IndexWriter(dir, iwc); }
設(shè)置索引字段,Store表示是否對(duì)索引內(nèi)容存儲(chǔ):fileName和fullPath占用內(nèi)存較少可以進(jìn)行存儲(chǔ),以方便查詢返回。
private Document getDocument(File f)throws Exception { Document doc=new Document(); doc.add(new TextField("contents", new FileReader(f))); doc.add(new TextField("fileName", f.getName(),Store.YES)); doc.add(new TextField("fullPath",f.getCanonicalPath(),Store.YES));//路徑索引 return doc; }
執(zhí)行主代碼后結(jié)果如圖:設(shè)計(jì)在索引某個(gè)文件的時(shí)候返回文件“索引文件:+文件路徑”,且計(jì)算輸出索引全部文件花費(fèi)的時(shí)間。
4.3 對(duì)索引的刪除和修改
一般對(duì)數(shù)據(jù)庫的操作包括CRUD(增加、刪除、更改、查詢),增加就是對(duì)索引項(xiàng)的選擇和建立,查詢作為較為核心的功能會(huì)在之后展開論述,這里主要記錄一下在刪除、更新索引時(shí)用到的方法。
刪除分為兩種類型,包括普通的刪除和徹底刪除,因?yàn)樗饕膭h除影響到整個(gè)數(shù)據(jù)庫,而且對(duì)于大型的系統(tǒng)而言,刪除索引意味著對(duì)系統(tǒng)的底層進(jìn)行更改,耗時(shí)耗力而且無法返回,前面索引的時(shí)候看到建立索引后生成若干小文件,當(dāng)進(jìn)行查找的時(shí)候會(huì)將各個(gè)文件進(jìn)行合并然后查找。普通刪除僅僅是對(duì)之前建立的索引做個(gè)簡單的標(biāo)記,致使無法進(jìn)行查找返回。徹底刪除則是對(duì)索引進(jìn)行銷毀,無法撤銷。以刪除索引項(xiàng)“id”為1的索引為例:
普通的刪除(在合并前刪除):
writer.deleteDocuments(new Term("id","1")); writer.commit();
徹底的刪除(在合并后刪除):
writer.deleteDocuments(new Term("id","1")); writer.forceMergeDeletes(); // 強(qiáng)制刪除 writer.commit();
對(duì)索引的修改原理比較簡單,就是在原有索引的基礎(chǔ)上實(shí)現(xiàn)覆蓋,實(shí)現(xiàn)代碼跟上文的增加索引一樣,在此不多做闡述。
4.4 對(duì)索引的加權(quán)
Lucene默認(rèn)按照相關(guān)度排序,Lucene對(duì)Field提供了一個(gè)可以設(shè)置的Boosting參數(shù),這個(gè)參數(shù)用來表示記錄的重要性,在滿足搜索條件是,會(huì)優(yōu)先考慮重要性高的記錄,返回結(jié)果靠前,如果記錄較多,權(quán)值低的記錄會(huì)排到首頁之后,因此,對(duì)索引的加權(quán)操作是影響返回結(jié)果滿意度的重要因素,在實(shí)際設(shè)計(jì)信息系統(tǒng)的時(shí)候,應(yīng)該有嚴(yán)格的權(quán)值計(jì)算公式,方便對(duì)Field權(quán)值的更改,更好的滿足用戶的需求。
例如搜索引擎將點(diǎn)擊率高,鏈入鏈出的網(wǎng)頁給定較高的權(quán)重,在返回的時(shí)候排到第一頁。實(shí)現(xiàn)代碼如圖4-1所示,不加權(quán)和加權(quán)結(jié)果對(duì)比如圖4-2所示。
TextField field = new TextField("fullPath", f.getCanonicalPath(), Store.YES); if("A GREAT GRIEF.txt".equals(f.getName())){ field.setBoost(2.0f);//對(duì)文件名為secondry story.txt的fullPath路徑加權(quán); } //默認(rèn)權(quán)重為1.0,改為1.2即增加權(quán)重。 doc.add(field);
圖4-1:索引加權(quán)
圖4-2:加權(quán)之前
圖4-2:加權(quán)之后
由圖4-2結(jié)果可以看出,不加權(quán)時(shí),按照字典順序排列返回,因此first在secondry之前,在對(duì)secondry命名的文件路徑加權(quán)后,返回的時(shí)候順序發(fā)生變化,實(shí)現(xiàn)對(duì)權(quán)重的測試。
5 進(jìn)行查詢
Lucene 的檢索接口主要由QueryParser、IndexSearcher、Hits這3 個(gè)類構(gòu)成,QueryParser 是查詢解析器,負(fù)責(zé)解析用戶提交的查詢關(guān)鍵字,在新建一個(gè)解析器時(shí)需要指定要解析的域和使用什么語言分析器,這里使用的語言分析器必須與索引庫建立時(shí)使用的解析器相同,否則查詢結(jié)果不正確。IndexSearcher是索引搜索器,在實(shí)例化IndexSearcher時(shí)需要指定索引庫所在的目錄,IndexSearcher有一個(gè)search 方法執(zhí)行索引的檢索,這個(gè)方法接受Query 作為參數(shù),返回Hits,Hists 是一系列排好序的查詢結(jié)果的集合,集合的元素是Document。通過Document的get 方法可以得到與這個(gè)文檔對(duì)應(yīng)文件的信息,比如:文件名、文件路徑、文件內(nèi)容等。
5.1 基本查詢
如圖查詢主要有兩種方式,但是推薦使用第一種構(gòu)造QueryParser表達(dá)式,它可以有靈活的組合方式,包括布爾邏輯表達(dá)、模糊匹配等,但是第二種Term只能針對(duì)詞匯查詢。
1.構(gòu)造QueryParser查詢式:
QueryParser parser=new QueryParser("fullPath", analyzer); Query query=parser.parse(q);
2.對(duì)特定項(xiàng)的查詢:
Term t = new Term("fileName", q); Query query = new TermQuery(t);
查詢結(jié)果如圖5-1所示:以查詢文件名fileName包含“大”為例。
圖5-1:“大”查詢結(jié)果
5.2 模糊查詢
在構(gòu)造QueryParser時(shí),通過對(duì)詞項(xiàng)q的修改可以實(shí)現(xiàn)精確匹配和模糊匹配。模糊匹配通過在“q”之后加“~”進(jìn)行修改。如圖5-2所示:
圖5-2:模糊匹配
5.3 限定條件查詢
布爾邏輯查詢和模糊查詢只需要對(duì)查詢?cè)~q進(jìn)行更改,而限定條件查詢需要對(duì)query表達(dá)式進(jìn)行設(shè)定,主要分為以下幾類:
分別為指定項(xiàng)范圍搜索、指定數(shù)字范圍、指定字符串開頭和多條件查詢,分別列出應(yīng)用的查詢,true參數(shù)指的:是否包含上限和下限在內(nèi)。
指定項(xiàng)范圍:
TermRangeQuery query=new TermRangeQuery("desc", new BytesRef("b".getBytes()), new BytesRef("c".getBytes()), true, true);
指定數(shù)字范圍:
NumericRangeQuery<Integer> query=NumericRangeQuery.newIntRange("id", 1, 2, true, true);
指定字符串開頭:
PrefixQuery query=new PrefixQuery(new Term("city","a"));
多條件查詢:
NumericRangeQuery<Integer>query1=NumericRangeQuery.newIntRange("id", 1, 2, true, true); PrefixQuery query2=new PrefixQuery(new Term("city","a")); BooleanQuery.Builder booleanQuery=new BooleanQuery.Builder(); booleanQuery.add(query1,BooleanClause.Occur.MUST); booleanQuery.add(query2,BooleanClause.Occur.MUST);
5.4 高亮查詢
在百度、谷歌等搜索引擎中,進(jìn)行查詢時(shí),返回的網(wǎng)頁包含查詢關(guān)鍵字的時(shí)候會(huì)顯示為紅色,且進(jìn)行摘要顯示,即對(duì)包含關(guān)鍵字的部分內(nèi)容進(jìn)行截取并返回。高亮查詢即為實(shí)現(xiàn)對(duì)關(guān)鍵字的樣式更改,本實(shí)驗(yàn)在myeclipse中進(jìn)行,返回結(jié)果并不會(huì)有樣式的改變,只會(huì)對(duì)返回內(nèi)容的關(guān)鍵字添加html標(biāo)簽,如果顯示到網(wǎng)頁即產(chǎn)生樣式的變化。
高亮的設(shè)置代碼如圖5-3所示,結(jié)果如圖5-4所示,會(huì)對(duì)南京匹配詞添加<b>和<font>標(biāo)簽,顯示到網(wǎng)頁上為加粗和變紅。
QueryScorer scorer=new QueryScorer(query); Fragmenter fragmenter=new SimpleSpanFragmenter(scorer); SimpleHTMLFormatter simpleHTMLFormatter=new SimpleHTMLFormatter("<b><font color='red'>","</font></b>"); Highlighter highlighter=new Highlighter(simpleHTMLFormatter, scorer); highlighter.setTextFragmenter(fragmenter);
圖5-3:高亮設(shè)置
圖5-4:高亮顯示結(jié)果
6 實(shí)驗(yàn)過程中遇到的問題和不足
Lucene版本更新較快,在jdk版本、eclipse版本和lucene版本之間需要一個(gè)良好的銜接,否則會(huì)造成很多的不兼容,在調(diào)試版本以及jdk1.6和jdk1.8的選擇上出現(xiàn)很多困難,比如網(wǎng)頁抓取中的append方法在1.8版本已經(jīng)刪除,不能使用。但是對(duì)文檔路勁的讀取FSDirectory.open()則需要jdk1.8才支持。
本實(shí)驗(yàn)的不足之處主要表現(xiàn)在:
代碼的靈活性較低,在爬取網(wǎng)頁的時(shí)候需要手工進(jìn)行,且需要對(duì)中文和英文分別進(jìn)行,應(yīng)該完善代碼使得對(duì)網(wǎng)頁的語言有個(gè)判定,然后自動(dòng)選擇執(zhí)行不同的分詞器。
代碼的復(fù)用性較低,沒有較為合理的分類和方法的構(gòu)建,為了簡便,基本在幾個(gè)核心代碼中進(jìn)行注釋和標(biāo)記而實(shí)現(xiàn)效果,有待改進(jìn)。
代碼的可移植性較低,對(duì)網(wǎng)頁的爬取使用的是jdk1.6的版本,Lucene的實(shí)現(xiàn)使用的是jdk1.8的版本,在導(dǎo)出到其他機(jī)器上,需要對(duì)環(huán)境稍加修改和配置,無法實(shí)現(xiàn)一鍵式操作。
以上是“Lucene如何實(shí)現(xiàn)索引和查詢”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站名稱:Lucene如何實(shí)現(xiàn)索引和查詢
文章分享:http://www.rwnh.cn/article10/pgsido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站改版、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)、定制開發(fā)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)