2012-07-25 28 views
1

我正在構建一個系統,在這個系統中,條目在一天中偶爾添加到SQL數據庫中。我正在嘗試創建一個每次將這些條目導入到SOLR的系統。SOLR - 一次添加一個條目

我似乎無法找到關於從SQL添加個人記錄到SOLR的任何信息。任何人都可以指引我正確的方向,或給我更多的信息讓我走?

任何幫助將不勝感激,

詹姆斯

+0

你使用任何python web框架? – 2012-07-25 09:55:28

+0

我在Python和Flask框架中使用MySolr插件 – 2012-07-25 11:47:25

回答

1

如果您有權訪問將條目添加到SQL數據庫的代碼,只需修改它以另外創建一個XML字符串並將其發佈到您的Solr服務器URL。這樣你就避免了很多複雜性。例如,在PHP中你可能會做這樣的事情:

$url = "http://localhost:7641/solr/update"; 
$header = array("Content-type:text/xml; charset=utf-8"); 
$postString = "<add><doc><field name=\"id\">24</field></doc?</add>"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); 
$data = curl_exec($ch); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "<commit />"); 
$data = curl_exec($ch); 

使用Python的捲曲庫 - 這將是比上面的代碼更簡單。

如果您無權訪問該代碼,請在數據庫中添加last_modified時間戳字段,並使用DataImportHandler的delta import functionality來查詢新項目並將其導入Solr。您將不得不定期調用DataImportHandler請求處理程序。

+0

嗨,感謝您的回覆。我之前沒有聽說過這種方法,您是否願意進一步詳細說明。這是你在說什麼嗎? http://wiki.apache.org/solr/UpdateXmlMessages – 2012-07-26 09:21:17

+0

@JamesWillson是的,我不知道該頁面存在,但它準確地描述了我的意思。該頁面聽起來很複雜,但非常簡單。查看通過cURL更新數據的部分,並讓我知道你是否有更具體的問題。 – Ansari 2012-07-26 09:31:48

1

如上所述,數據導入處理程序可以滿足您的需求,但是一個重要的限制是它不排隊請求。這樣做的結果是,如果DIH正忙於索引某些內容並且您啓動了另一個DIH請求,則第二個將被忽略並且未被編入索引。

正如Ansari建議的,更直接的路由是簡單地將HTTP數據直接發佈到Solr服務器。他指出了絕對可行的XML方法。但是,我發現使用http://wiki.apache.org/solr/UpdateJSON/方法更簡單,因爲它允許我在收集數據時使用本機數據結構。

當使用UpdateJSON或UpdateXMLMessage方法時,我強烈建議使用「commitWithin」參數而不是「commit」。提交可以是(相對)較長的過程,需要Solr鎖定文件,而commitWithin會將多個更新請求批量處理爲單個提交,而「commit」則需要每個POST的文件鎖定。

0

除了DIH,您可以在您的數據庫中設置一個觸發器來觸發Solr的REST服務,該服務將更新所有插入/更新/刪除文檔的更改文檔。另外,你可以在你的應用程序中設置一個Filter(javax.servlet spec)來攔截服務器請求並在它們到達數據庫之前將它們推送到Solr(它甚至可以在同一個事務中完成,但很少有真正的需要這一點,最終的一致性通常對搜索引擎來說很好)。

相關問題