【问题标题】:SOLR - Adding a single entry at a timeSOLR - 一次添加一个条目
【发布时间】:2012-07-25 09:52:21
【问题描述】:

我正在构建一个系统,在该系统中,条目会在一天中不时地添加到 SQL 数据库中。我正在尝试创建一个系统,每次都将这些条目导入 SOLR。

我似乎找不到任何有关从 SQL 向 SOLR 添加单个记录的信息。谁能指出我正确的方向或给我更多信息让我继续前进?

任何帮助将不胜感激,

詹姆斯

【问题讨论】:

  • 你在使用任何python web框架吗?
  • 我正在将 MySolr 插件与 Python 和 Flask 框架一起使用

标签: python search solr


【解决方案1】:

您看过DataImportHandler 的维基页面吗?我相信它会做你想做的事。

【讨论】:

    【解决方案2】:

    如果您有权访问将条目添加到 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 的 delta import functionality 来查询新项目并将它们导入 Solr。您必须定期调用 DataImportHandler 请求处理程序。

    【讨论】:

    • 您好,感谢您的回复。我以前没有听说过这种方法,您是否愿意详细说明。这就是你在说的吗? wiki.apache.org/solr/UpdateXmlMessages
    • @JamesWillson 是的,我不知道该页面存在,但它准确地描述了我的意思。该页面使它听起来很复杂,但它真的很简单。查看通过 cURL 更新数据的部分,如果您有更具体的问题,请告诉我。
    【解决方案3】:

    如上所述,数据导入处理程序可以满足您的需求,但是一个重要的限制是它不会对请求进行排队。这样做的结果是,如果 DIH 正忙于索引某些内容并且您触发了另一个 DIH 请求,则第二个请求将被忽略并且不会被索引。

    正如 Ansari 所建议的,更直接的方法是将数据直接 HTTP POST 到 Solr 服务器。他指出了绝对可以正常工作的 XML 方法。但是,我发现使用http://wiki.apache.org/solr/UpdateJSON/ 方法更简单,因为它允许我在收集数据时使用本机数据结构。

    当使用 UpdateJSON 或 UpdateXMLMessage 方法时,我强烈建议使用“commitWithin”参数而不是“commit”。提交可能是(相对)冗长的过程,需要 Solr 锁定文件,并且 commitWithin 会将多个更新请求批处理到单个提交中,而“提交”需要为每个 POST 锁定文件。

    【讨论】:

      【解决方案4】:

      除了 DIH,您还可以在数据库中设置一个触发器来触发 Solr 的 REST 服务,该服务将更新所有插入/更新/删除文档的更改文档。

      此外,您可以在您的应用程序中设置一个过滤器(javax.servlet 规范)来拦截服务器请求并在它们到达数据库之前将它们推送到 Solr(它甚至可以在同一个事务中完成,但很少真正需要为此,最终的一致性通常对搜索引擎来说很好)。

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        相关资源
        最近更新 更多