1. Elasticsearch 倒排索引
之前我們已經了解過,Elasticsearch 是一個基於 Lucene 實現的分布式全文檢索引擎,其實 Elasticsearch 倒排索引就是 Lucene 的倒排索引。數據檢索是 ES 的一項核心功能,它的底層實現也是離不開倒排索引的,通過倒排索引技術可以提高數據的檢索效率,理解倒排索引的原理很重要。
那什麼是倒排索引,我們該如何理解它呢?
我們能進行數據檢索的前提條件是,已經創建好了索引庫,並給里邊添加了文檔數據。所以我們可以按照 創建索引庫 、 添加文檔 、 數據檢索 這個順序來認識倒排索引。
首先是創建索引庫,我們之前已經安裝好了 IK 分詞器,這里我們創建一個 test 索引,它只有一個 content 欄位,添加文檔時欄位的分詞模式是 ik_max_word ,檢索時關鍵字的分詞模式是 ik_smart :
欄位的分詞模式會影響最終生成的倒排索引。不了解分詞器的可以參考 Elasticsearch 中文分詞器插件 。
創建好了索引,我們來添加一條文檔數據:
添加文檔數據時,ES 會根據欄位的分詞模式將欄位的值拆分成多個 詞條 (Term)(或者稱作詞項),創建索引庫時我們指定了 content 欄位分詞模式為 ik_max_word ,則會生成如下的詞條:
接下來就是建立倒排索引了,在這之前我們先了解兩個概念 詞條字典 (Term Dictionary)、 倒排列表 (Posting List):
ES 的倒排索引就是由 詞條字典 和 倒排列表 兩部分組成的。如下就是一個簡易版的倒排索引,倒排列表項只有詞條對應的文檔 id:
一個詞條對應一個倒排索引項。ES 會給每個欄位都建立一個倒排索引。
我們再添加一條文檔數據:
根據上邊的原理,最終 content 欄位的倒排索引會被更新成如下結構:
前邊已經添加了文檔數據,同時也生成了倒排索引,接下來就是檢索數據了。在這之前還有一個知識點需要了解,那就是 詞條索引 (Term Index),詞條索引一般只存儲各個 詞條 的前綴(第一個字元),它和字條字典對應。之所以需要詞條索引,是因為 詞條字典 一般都很大,不適合保存在內存中而是存儲在磁碟中,檢索數據時根據關鍵字的前綴匹配到詞條索引,再根據詞條索引定位到關鍵字在倒排索引的詞條字典中大致的位置,然後進一步在詞條字典中通過二分查找定位到具體的詞條,這樣避免了直接遍歷詞條字典來點位詞條,大幅減少了磁碟的讀取,提高了效率。
定位到了詞條,就能在倒排索引中找到對應的倒排列表項,進而就知道了對應的文檔 id,有了文檔 id 自然也就找到了文檔,這也就是 ES 檢索數據大致的原理。
如下我們查詢包含 十二 的文檔數據:
由於我們創建索引庫時指定了檢索時關鍵字的分詞模式是 ik_smart ,所以 十二 被分詞後還是 十二 ,再結合上邊的原理,以 十二 為關鍵字最終可以查詢到 id 為 1、2 的文檔數據:
這篇最好能結合 Elasticsearch 中文分詞器插件 一起看,這樣能更容易理解些。
新手上路,不合理的地方還望大佬指點。
heritrix抓取網頁
網頁解析的有很多就不說了,不過最好自己寫
lucene索引
首先爬蟲是需要一個處理器鏈的,網頁的抓取並非幾十行代碼就能實現的,因為有很多問題出
現。
1.獲取網頁:判斷網頁編碼,計算網頁正文位置,獲取頁面內url(url的過濾、緩存、存儲這部分還需要線程池的優化),url的分配、及線程池的啟動。
2.網頁持久化。網頁解析,網頁中樣式表、圖片等下載以及網頁的保存(xml和html)網頁快照的生成。
3.網頁的消重去噪:去掉沒用的網頁,如果是垂直搜索引擎則需要更多的判斷,可以利用內容模板和空間向量的演算法實現。
4.索引的建立及優化,主要是簡歷倒排索引。
你的分類基本上可以用內容模板和空間向量計算實現。
還有其他很多東西,一時間不能說細了。你想做到什麼程度。(比如:空間向量的演算法及結果的參考值、網頁內容模板的建立。)
3. java代碼轉時序圖或抽象語義樹 ,下面是java代碼
System.Security.Cryptography.SHA512 shaM = new System.Security.Cryptography.SHA512Managed(); 是個類是.net的類,要java中也有相關類要回自己去寫。答
4. JAVA編程問題求助 編寫程序,把一個數組中的元素倒過來。例如原數組為1,2,3,4,5。則倒排
importjava.util.*;
importstaticjava.lang.System.*;
importstaticjava.util.Arrays.*;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Integer[]array={1,2,3,4,5};
//數組工具類的排列方法,我開始嘗試使用Lambda表達式但是失敗了
sort(array,newComparator<Integer>()
{
publicintcompare(Integera,Integerb)
{
//如果a大於b返回a小於b,反之亦然,造成倒序排列的效果
returna>b?-1:a<b?1:0;
}
});
//輸出排列後的數組,輸出"[5,4,3,2,1]"
out.println(Arrays.toString(array));
}
}