我正在构建一个系统,其中条目会在一天中偶尔添加到 SQL 数据库中。我正在尝试创建一个系统,每次都将这些条目导入 SOLR。
我似乎找不到任何关于从 SQL 向 SOLR 添加单个记录的信息。谁能指出我正确的方向或给我更多信息让我继续前进?
任何帮助将非常感激,
詹姆士
如上所述,数据导入处理程序可以满足您的需求,但是一个重要的限制是它不会对请求进行排队。这样做的结果是,如果 DIH 忙于索引某些内容并且您触发了另一个 DIH 请求,则第二个请求将被忽略并且不会被索引。
正如 Ansari 所建议的,更直接的方法是简单地将数据 HTTP POST 直接发送到 Solr 服务器。他指出了绝对可以正常工作的 XML 方法。但是,我发现使用http://wiki.apache.org/solr/UpdateJSON/方法更简单,因为它允许我在收集数据时使用本机数据结构。
在使用 UpdateJSON 或 UpdateXMLMessage 方法时,我强烈建议使用“commitWithin”参数而不是“commit”。提交可能是(相对)漫长的过程,需要 Solr 锁定文件,并且 commitWithin 会将多个更新请求批处理到单个提交中,而“提交”需要为每个 POST 锁定文件。
您看过DataImportHandler的 wiki 页面吗?我相信它会做你想要的。
如果您有权访问将条目添加到 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 的 curl 库——它会比上面的代码更简单。
如果您无权访问该代码,请将 last_modified 时间戳字段添加到您的数据库并使用 DataImportHandler 的增量导入功能来查询新项目并将它们导入 Solr。您必须定期调用 DataImportHandler 请求处理程序。
除了 DIH,您可以在您的数据库中设置一个触发器来触发 Solr 的 REST 服务,该服务将为所有插入/更新/删除的文档更新更改的文档。
此外,您可以在您的应用程序中设置一个过滤器(javax.servlet 规范)来拦截服务器请求并将它们推送到 Solr,甚至在它们到达数据库之前(它甚至可以在同一个事务中完成,但实际上很少需要这样做,最终的一致性通常对搜索引擎来说很好)。