簡體   English   中英

java - MongoDB + Solr表演

[英]java - MongoDB + Solr performances

我一直在四處尋找如何將MongoDB與Solr結合使用,這里的一些問題有部分反應,但沒有什么真正具體的(更像是理論)。 在我的應用程序中,我將在MongoDB中存儲大量的文檔(可能高達數億),我想對這些文檔的某些屬性實現全文搜索,所以我猜Solr是最好的方法這個。

我想知道的是我應該如何配置/執行所有內容以使其具有良好的性能? 現在,這就是我做的事(我知道它不是最優的):

1-在MongoDB中插入對象時,我將其添加到Solr

SolrServer server = getServer();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
server.add(document);
server.commit();

2-當更新對象的屬性時,由於Solr不能只更新一個字段,首先我從MongoDB中檢索對象然后用對象和新屬性的所有屬性更新Solr索引並執行類似的操作

StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0);
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
update.add(document);
update.commit();

3-查詢時,首先查詢Solr,然后在檢索文檔列表SolrDocumentList我會瀏覽每個文檔,並且:

  1. 獲取文檔的ID
  2. 從MongoDB獲取具有相同id的對象,以便能夠從那里檢索屬性

4-刪除時,我還沒有完成那部分,並且不確定如何在Java中完成

那么有人建議如何以更有效的方式為這里描述的每個場景做到這一點? 喜歡這樣做的過程,當在Solr中有大量文檔並一次添加一個文檔時,它不會花費1小時來重建索引? 我的要求是用戶可能希望一次添加一個文檔,我希望他們能夠立即檢索它

你的方法實際上很好。 一些流行的框架(如Compass)正在執行您在較低級別描述的內容,以便自動鏡像通過ORM框架執行的索引更改(請參閱http://www.compass-project.org/overview.html )。

除了你描述的內容之外,我還會定期重新索引MongoDB中的所有數據,以確保Solr和Mongo同步(可能沒有你想象的那么長,具體取決於文檔的數量,字段的數量,每個字段的令牌數量和分析器的性能:我經常使用復雜的分析器在不到15分鍾的時間內創建500到800萬個文檔(大約20個字段,但文本字段很短)的索引,只需確保你的RAM緩沖區不是太小,在添加所有文檔之前不會提交/優化。

關於性能,提交成本高,優化成本高。 根據對您最重要的事情,您可以在Solrconfig.xml中更改mergefactor的值(高值可提高寫入性能,而低值可提高讀取性能,10值是一個很好的值)。

你似乎害怕索引構建時間。 但是,由於Lucene索引存儲是基於段的,因此寫吞吐量不應過多依賴於索引的大小(http://lucene.apache.org/java/2_3_2/fileformats.html)。 但是,預熱時間會增加,所以你應該確保

  • 有典型的(特別是對於加載fieldcaches的排序)但是在firstSearcher和solrconfig.xml配置文件中的newSearcher參數中沒有太復雜的查詢,
  • useColdSearcher設置為
    • 為了獲得良好的搜索性能,或者為false
    • 如果您希望以較慢的搜索價格更快地考慮對索引執行的更改,則為true。

此外,如果數據在寫入MongoDB后僅幾個X毫秒就可以搜索,如果可以接受,則可以使用UpdateHandler的commitWithin功能。 這樣Solr就不得不經常提交。

有關Solr性能因素的更多信息,請參閱http://wiki.apache.org/solr/SolrPerformanceFactors

要刪除文檔,您可以按文檔ID(在schema.xml中定義)或通過查詢刪除: http//lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html

  1. 您還可以等待更多文檔並僅在每X分鍾為其編制索引。 (當然這在很大程度上取決於您的應用和要求)

  2. 如果您的文檔很小並且您不需要所有數據(存儲在MongoDB中),您只能通過存儲而不是索引來放置Solr文檔中所需的字段。

<field name="nameoyourfield" type="stringOrAnyTypeYouuse" indexed ="false" stored ="true"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM