1. 程式人生 > >呼叫lucene向solr建索引實踐

呼叫lucene向solr建索引實踐

      Solr的底層是基於Lucene索引結構,Lucene是一套資訊檢索工具包,但並不包含搜尋引擎系統,它包含了索引結構、讀寫索引工具、相關性工具、排序等功能。所以,只要是相同版本的Solr和Lucene其用的索引檔案是相容的,solrconfig.xml有使用Lucene的版本資訊。如果我們直接利用Lucene來寫Solr的索引目錄,降低網路開銷,並且減去Solr除了索引以外功能做的額外開銷,從提升建索引的角度,有不錯的提升。

 

 如上圖所示:

1、客戶端呼叫Lucene的API直接在本地的Solr的core的目錄建索引。(Collection的一個shard的副本其實就是一個core檔案)

2、多個客戶端,每個客戶端對應一個shard副本,注意這裡是一個shard只有一個副本的情況下,如果多個副本需要注意副本之間的資料同步的問題。

       在實際的場景中,為了防止多執行緒操作同一個檔案帶來的問題,Lucene可以在其他目錄建立索引,然後通過定期合併索引檔案的方式,載入到solr的shard中。流程如下圖所示:

     

過程說明:

1、 客戶端程式呼叫lucene的API進行寫索引。

2、 索引寫到特定的目錄下。

3、 呼叫solr的索引合併的HTTP介面,進行索引合併。

4、 呼叫HTTP的合併結構後會將Lucene新建的索引目錄合併到Solr的索引中去。

 注意:

1、 這種合併的URL如下:http://x.x.x.x:port/solr/admin/cores?action=mergeindexes&core=collection_shard1_replica1&indexDir=/parkfs01/aus/soft/luncenetmp/0

2、 合併後的索引不是可見的,需要重新載入索引,或者重新做提交,提交時候需要開啟搜尋器使索引可見:http://x.x.x.x:port/ solr/collection/update?commit=true&openSearcher=true這裡的collection要改成具體的collection名字。在單節點時候需要重新載入整個core,這個耗時很大,單節點僅僅提交,仍然搜尋不到新新增的文件。

       有了上面的支撐,結合流程中比較耗時的操作,綜合考慮,可以按照下圖所示的架構來設計程式:

                                                      

說明:

1、根據要求生成文件。

2、根據生成的文件列表生成可執行單元,可以執行單元的主要是建立IndexWriter和新增索引動作。

3、將可行物件傳送給執行緒池執行。

4、執行完畢後將需要合併的索引目錄和url傳送到合併佇列,合併佇列數量達到一定數量後,執行合併索引動作和提交索引動作。

5、索引執行緒池存在建立一定數量索引後,會關閉原來的IndexWriter,從新建立的目錄生成新的IndexWriter。

 注意:

1、因為IndexWriter是執行緒安全的,所以執行緒池可以共同操作同一個IndexWriter物件。

2、在合併索引後,不能立刻刪除目錄,呼叫SOLR的合併索引的URL返回後,後臺也有可能還在合併。

3、經過測試在一個索引文件286個位元組條件下,solr6.0版本,速率大概在4.7W和5.1W之間浮動;一個報文2K的情況下,每秒大概有3.5W到4W之間。

相關推薦

呼叫lucenesolr索引實踐

      Solr的底層是基於Lucene索引結構,Lucene是一套資訊檢索工具包,但並不包含搜尋引擎系統,它包含了索引結構、讀寫索引工具、相關性工具、排序等功能。所以,只要是相同版本的Solr和

lucene之創索引代碼

dao 根據 arr conf document 通過 數據 getname pan public void createIndex() throws IOException { // 第一步采集數據:(jdbc采集數據) BookDao dao = new BookDao

優化solr全量索引速度實踐

           solr全量建索引一般瓶頸都出現在讀資料來源這一端。 目前資料庫為Mysql,單表資料2000w,如果採用分頁讀取mysql的方式,大家都知道Mysql分頁越靠後分頁速度越慢。本人在專案中採取如下方案進行解決。          假如商品表goods存

全文索引-lucenesolr,nutch,hadoop之nutch與hadoop

aof java get 查詢 自己 結構 目的 strong 之間 全文索引-lucene。solr。nutch,hadoop之lucene 全文索引-lucene。solr,nutch,hadoop之solr 我在去年的時候,就想把lucene,sol

lucene索引以及索引文件合並

dex null menu test alt tor document oid stand 1 package test; 2 3 import java.io.File; 4 import java.io.IOException; 5 import

lucene索引

lucene創建索引1.導入jar包2.創建實體Beanpackage com.zhishang.lucene; /** * Created by Administrator on 2017/7/8. */ public class HtmlBean { private String title

solr整合springboot並solr推送索引資料更新和查詢

雖然說是很簡單的功能,但是在此記錄一下 首先匯入maven對映 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</

solr_4.5.0_07:從資料庫 solr 中新增索引

今天,我們來講一下 solr 網頁管理中 Dataimport 的使用。 一、首先我們需要在 D:\zsolrwork\solr\server\webapps\solr\WEB-INF\lib 目錄下新增 solr-dataimporthandler-4.5.0.jar、s

Luke:用於Lucene / Solr / Elasticsearch索引的GUI工具

Luke是由Andrzej Bialecki建立的Lucene Indexing Toolbox。該工具解決了Lucene / Solr工程師需要深入瞭解索引中實際儲存的內容並深入瞭解索引統計資訊的工具

SQL Server 查詢性能優化——創索引原則(二)

技術分享 dex ble 銷售 得到 with 9.png ron 條件 三:索引的建立原則   一般來說,建立索引要看數據使用的場景,換句話來說哪些訪問數據的SQL語句是常用的,而這些語句是否因為缺少索引(也有可能是索引過多)變的效率低下。但絕不是所有的SQL語句都要建

UESTC30-最短路-Floyd最短路、spfa+鏈式前

ring 輸入 sam -m 努力 成都 edge 輸出 工作 最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校賽裏,所有進入決

where條件順序與索引順序

版本 sql查詢優化 臨時 dash 沒有 多表 測試 最小 問題 查詢時,如果數據量很大,where 後面的條件與建索引的順序相同,也沒有什麽多少差別,聚集索引稍微快點; 但where 後面的條件與建索引順序不同,速度會慢下來,到底慢多少,不同的機器會不一樣,沒有絕對的說

記錄一次數據庫某表未創索引造成的問題

如果 問題 大量 alt 多表 ima count 重建 sql 現象描述: 昨天鷹網監控告知廊坊某臺物理機CPU使用率接近100%,查看得知每顆邏輯CPU的使用率都接近了100%,但該數據庫機器是測試機器,按理說不會造成此問題。截圖如下: 處理步驟: 1. 查看消耗大

索引並進行查詢

roc put color rop nbsp first span ppi fulltext curl -XPUT http://localhost:9200/suoyin1 curl -XPOST http://localhost:9200/suoyin

無法對視圖創索引,因為該視圖未綁定到架構

clas clu binding back -- 進行 with 說明 join   最近在對視圖進行優化的時候,之前的查詢效率不理想,所有想給視圖添加索引,提供查詢效率,遇到這個問題,查了一位博主的文章,但是說的不是很詳細,在這裏說明白一些。 修改此問題 需要在 創建視圖

mysql創索引

aaa 嚴重 鄭州 sql查詢 形象 between update 類型 過多 在數據庫表中,對字段建立索引可以大大提高查詢速度。假如我們創建了一個 mytable表: 復制代碼 代碼如下: CREATE TABLE mytable( ID INT NOT NULL,

數據庫查詢優化——給臨時表索引

objects info ner create 優化 and 查詢 查詢優化 dex 平時查詢數據庫時為了查詢更加快速,一般都會用到臨時表,如select * into #t from tableA ,但是如果數據過大,但但用臨時可能也很慢,這時候可以給臨時表建個索引,如C

ORACLE 數據庫需要創索引的規則

存儲 選擇 處理 oracl 避免 創建 規則 索引 連接 1、表的主鍵、外鍵必須有索引; 2、數據量超過300的表應該有索引; 3、經常與其他表進行連接的表,在連接字段上應該建立索引; 4、經常出現在Where子句中的字段,特別是大表的字段,應該建立索引; 5、索引應該建

表的時候創索引

explain命令 using 必須 reat eat plain sin mit 運行 創建索引是指在某個表的一列或多列上建立一個索引,以便提高對表的訪問速度。創建索引有3種方式,這3種方式分別是創建表的時候創建索引、在已經存在的表上創建索引和使用ALTER TA

mysql索引 ->創索引、修改索引、刪除索引的命令語句

兩種 uniq 語法 hang records column rop tps 含義 查看表中已經存在 index:show index from table_name; 創建和刪除索引索引的創建可以在CREATE TABLE語句中進行,也可以單獨用CREATE INDEX