Solr索引的建立和優化

来源:http://www.cnblogs.com/herohawk/archive/2016/08/24/5802439.html
-Advertisement-
Play Games

目前我知道Solr建索引有2種方法,這裡介紹一下: 第一種就是我們常用的SolrServer.add(Collection<SolrInputDocument>),下麵介紹一個各種SolrServer. * HttpSolrServer,這個是我們最常用的就不說了 * ConcurrentUpdat ...


目前我知道Solr建索引有2種方法,這裡介紹一下:

 第一種就是我們常用的SolrServer.add(Collection<SolrInputDocument>),下麵介紹一個各種SolrServer.

* HttpSolrServer,這個是我們最常用的就不說了

* ConcurrentUpdateSolrServer, 這個是創建和更新時使用,查詢時不要用。保存了一個HttpSolrServer,用多線程技術併發向服務端提交索引數據,提高建索引的速度。

* LBHttpSolrServer, 這個保存了多個HttpSolrServer,進行負載均衡,提交查詢時會判斷哪個Server的壓力最小,向那個Server提交請求。和上面相反,查詢時使用,創建和更新索引時不建議使用。

* CloudSolrServer, 這個保存了一個LBHttpSolrServer,查詢時和LBHttpSolrServer類似,但創建和更新索引時,在客戶端會根據索引信息提交到對應的服務端。而HttpSolrServer是在服務端判斷索引需要提交到哪個對應服務端,然後進行轉發

* EmbeddedSolrServer,這個本地Server,單機使用,索引是保存在本地

  這種建索引的方法,除EmbeddedSolrServer外,客戶端除了發送數據外,服務端做了剩餘的全部工作,想要提高建索引速度,就2個方案,1客戶端用多線程提交索引,提高數據發送速度,但這個還取決於服務端接收數據的速度,服務端在高負荷的時候,速度就不會再提高了。2增加服務端節點數,這個就不說了,主要看硬體資源

    另一種並不常見,我看了solr-map-reduce部分的代碼才發現的。把建索引的過程分為了2步,

* 第一步利用EmbeddedSolrServer先在本地創建索引文件,這樣客戶端就分擔了大部分的服務端的工作,

* 第二步利用合併索引的功能把本地索引文件提交到服務端,這裡有個關鍵問題,就是合併索引時不再是http方式,而是磁碟目錄的方式,所以本地索引文件位置必須對服務端是可見,所以要把本地索引文件共用出來,可以用NFS的方式,另一種方法就是用hdfssolr源碼里是用的hdfs

  這種建索引的方法,好處是客戶端分擔了不少服務端的壓力,而不像前一種,除了發送數據外,其他時間都閑置了。我們可以用多線程技術,對數據分片,讓客戶端一邊建索引,服務端同時合併已經建好的本地索引,性能大幅度的提升了。

    下麵貼2段關鍵代碼,從solr源碼里考出來的。

創建EmbeddedSolrServer

public EmbeddedSolrServer createEmbeddedSolrServer(Path solrHomeDir, FileSystem fs, Path outputShardDir)
          throws IOException {

        if (solrHomeDir == null) {
          throw new IOException("Unable to find solr home setting");
        }
        System.out.println("Creating embedded Solr server with solrHomeDir: " + solrHomeDir + ", fs: " + fs + ", outputShardDir: " + outputShardDir);

        Path solrDataDir = new Path(outputShardDir, "data");
        String dataDirStr = solrDataDir.toUri().toString();

        SolrResourceLoader loader = new SolrResourceLoader(solrHomeDir.toString(), null, null);

        System.out.println(String
            .format(
                "Constructed instance information solr.home %s (%s), instance dir %s, conf dir %s, writing index to solr.data.dir %s, with permdir %s",
                solrHomeDir, solrHomeDir.toUri(), loader.getInstanceDir(),
                loader.getConfigDir(), dataDirStr, outputShardDir));

        // TODO: This is fragile and should be well documented
        System.setProperty("solr.directoryFactory", HdfsDirectoryFactory.class.getName()); 
        System.setProperty("solr.lock.type", "hdfs"); 
        System.setProperty("solr.hdfs.nrtcachingdirectory", "false");
        System.setProperty("solr.hdfs.blockcache.enabled", "false");
        System.setProperty("solr.autoCommit.maxTime", "600000");
        System.setProperty("solr.autoSoftCommit.maxTime", "-1");
        
        CoreContainer container = new CoreContainer(loader);
        container.load();
        
        Properties props = new Properties();
        props.setProperty(CoreDescriptor.CORE_DATADIR, dataDirStr);
        
        CoreDescriptor descr = new CoreDescriptor(container, "core1", solrHomeDir.toString(), props);
        
        SolrCore core = container.create(descr);
        
        if (!(core.getDirectoryFactory() instanceof HdfsDirectoryFactory)) {
          throw new UnsupportedOperationException(
              "Invalid configuration. Currently, the only DirectoryFactory supported is "
                  + HdfsDirectoryFactory.class.getSimpleName());
        }

        EmbeddedSolrServer solr = new EmbeddedSolrServer(container, "core1");
        return solr;
      }

 合併索引

    public Request call() {
        Request req = new Request();
        LOG.info("Live merge " + dir.getPath() + " into " + mergeUrl);
        final HttpSolrServer server = new HttpSolrServer(mergeUrl);
        try {
            CoreAdminRequest.MergeIndexes mergeRequest = new CoreAdminRequest.MergeIndexes();
            mergeRequest.setCoreName(name);
            mergeRequest.setIndexDirs(Arrays.asList(dir.getPath().toString() + "/data/index"));
            try {
                mergeRequest.process(server);
                req.success = true;
            } catch (SolrServerException e) {
                req.e = e;
                return req;
            } catch (IOException e) {
                req.e = e;
                return req;
            }
        } finally {
            server.shutdown();
        }
        return req;
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著社會經濟的發展,特別是互聯網的發展,企業的數據呈現幾何級的增長,大數據在過去的幾年裡一直是一個非常非常火的概念,並且一直在持續。但與此同時,企業對於數據的理解和應用卻大相徑庭。有一部分企業通過數據分析和挖掘能夠降低企業成本,提升業績,但也有一些企業對於數據的分析和應用停留在較淺層次。所以,數據分... ...
  • 需要的jar包 使用ojdbc6.jar 在/META-INF/MANIFEST.MF里可以看到Specification-Version: 4.0 建表 將文件寫入資料庫 將文件從資料庫中讀出 ...
  • 1.去重語句:DELETE FROM `v_klg_item` WHERE id NOT IN (SELECT * FROM (SELECT MAX(id) FROM `v_klg_item` GROUP BY NAME) AS tmp); 2.資料庫不同表之間列的複製語句:INSERT INTO ...
  • Select 1、查詢表中所有的數據 select * from 表名 select all id,name from 表名 select id,name from 表名 2、查詢表中完全匹配的數據 select * from 表A,表B where 表A.id=表B.id select * fro ...
  • 出處:kelvin19840813 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是對博主最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。 轉載wiki: https://zh.wikipedia.org/wiki/%E6% ...
  • 在用PL/SQL Developer等客戶端工具連接oracle伺服器時出現ORA-12541:TNS:無監聽程式的錯誤,如下圖: 發現原來是oracle的監聽沒有啟動,重啟監聽後就連接成功了,下麵跟大家分享一下如何啟動oracle的監聽。 1.在安裝Oracle伺服器的主機上,打開Net Conf ...
  • wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz sudo tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/ cd /usr/local/tcl8.6.1/unix/ sudo ./con ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...