2012-02-08 161 views
7

我需要經常更新solr中的大量文檔。例如,爲user_id = 5設置「online」= true,依此類推。但通過http處理程序索引的速度非常慢。 Solr支持通過查詢刪除文件,有沒有辦法通過查詢進行更新?通過查詢更新Solr索引

+0

關於這個話題還有一個很好闡述的jira問題,以及爲什麼它沒有解決:https://issues.apache。org/jira/browse/SOLR-7490 – cheffe 2016-02-15 11:20:16

回答

10

不幸的是,沒有任何功能像查詢更新。這將是非常有用的,就像一個新功能,可以更新文檔而無需重新提交;那裏有一個5歲的jira issue。現在,如果您使用相同的uniqueKey,那麼您應該重新提交包含更新字段的文檔,它們將被覆蓋(這意味着已刪除並重新插入)。

順便說一句,你是否在爲每個文檔發出一個http請求來更新?如果是的話,你可以在這樣的時刻更快提交超過一份文件:

<add> 
    <doc> 
    <field name="employeeId">05991</field> 
    <field name="office">Bridgewater</field> 
    </doc> 
    <doc> 
    <field name="employeeId">05992</field> 
    <field name="office">Bridgewater</field> 
    </doc> 
    <doc> 
    <field name="employeeId">05993</field> 
    <field name="office">Bridgewater</field> 
    </doc> 
</add> 
1

由於javanna回答,沒有任何設施通過查詢來更新,如Solr的也不允許你更新各個領域在存儲在索引中的文檔中,重新提交是唯一的更新方法。我很好奇,但爲什麼你的更新速度如此之慢。以下是一些可以提高更新速度的方法。

  • 如果在更新每個單獨的文檔後發出提交,請等待並且只有在更新了索引中的一批文檔後才發出更新。從Solr Tutorial

    提交可以是一個昂貴的操作,所以最好做在批處理許多變化 到一個索引,然後在最後發送commit命令。 除了將所有索引段合併爲一個段, 還有一個優化命令,它與commit, 具有相同的功能,因此可以更快地搜索並刪除所有已刪除的文檔,從而刪除 。

  • 查看使用軟提交或自動軟提交以減少更新延遲。有關更多詳細信息,請參閱Solr Wiki上的NearRealtimeSearch頁面。

+0

我認爲更新過程很慢,僅僅是因爲很多http請求......好的建議! – javanna 2012-02-08 12:49:02

0

我會使用DIH修改的SQL查詢,它將接受來自URL的參數。 SQL查詢將如下所示:

SELECT user_name, user_online FROM users WHERE user_id=${dataimporter.request.user_id} 

然後重新索引選擇的用戶要添加USER_ID參數,URL這樣的:

http://<host>:<port>/solr/dataimport?command=full-import&clean=false&user_id=5 

文檔有關使用DIH和自定義參數:Solr - DataImportHandler

6

目前仍然通過查詢沒有更新,但是從2012年的答案是過時的。現在在Solr 4.x中有https://wiki.apache.org/solr/Atomic_Updates,所以你可以在兩步中做你想做的事情,而不需要訪問原始文檔。

+0

原子更新有限制。正如Erick在maillist中所說的那樣,它仍然是場景後面的整個文檔更新。使用原子更新時未列出的文檔的字段必須「存儲」,否則在原子更新後它們的原始值可能會丟失,因爲我認爲它從原始索引中檢索這些未列出的字段的值,並將它們與列出的字段合併以進行原子更新,然後在整個場景後面更新整個文檔。 (在撰寫評論時,最新的Solr是v6.1.0) – 2016-06-29 09:57:49