向Solr发布更新会使重复

时间:2016-07-09 08:28:24

标签: php database solr full-text-search

我前几天才开始使用Solr 6.0,并使用curl通过php脚本更新了Solr索引。 但是现在,使用下面的php脚本更新时会有重复的条目。

现在的架构是这样的:id(唯一键字段),url,关键字,描述,标题。

这是因为我没有在带有架构的url上指定显式的唯一键字段吗?

我希望将url作为唯一键,以防止Solr在更新时索引重复项,并在重复时覆盖它。你是怎么做到的?

<?php
// apt-get install php5 libapache2-mod-php5 php5-curl


// curl 'http://localhost:8983/solr/update/csv?fieldnames=url,keywords,description,title&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @$file


$SOLR_SERVER = '127.0.0.1';
$CORE = 'core1';
ob_start();
$callback = &$_REQUEST['fd-callback'];
$url = 'http://'. $SOLR_SERVER .':8983/solr/'. $CORE .'/update/csv?fieldnames=url,keywords,description,title&commit=true';

if (!empty($_FILES['fd-file']) and is_uploaded_file($_FILES['fd-file']['tmp_name'])) {
    $name = $_FILES['fd-file']['name'];
    $data = file_get_contents($_FILES['fd-file']['tmp_name']);
} else {
    $name = urldecode(@$_SERVER['HTTP_X_FILE_NAME']);
    $data = file_get_contents("php://input");
}

$header = array("Content-type:text/csv; charset=utf-8");
$post = $data;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
//curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
curl_exec($ch);
curl_close($ch);
if ($ch) {
    $output = 'Upload Success!';
}else {
    $output = 'Upload did not work!';
}

// $opt = &$_REQUEST['upload_option'];
// isset($opt) and $output .= "\nReceived upload_option with value $opt";
if ($callback) {
    header('Content-Type: text/html; charset=utf-8');
    $output = addcslashes($output, "\\\"\0..\x1F");
    echo '<!DOCTYPE html><html><head></head><body><script type="text/javascript">',
       "try{window.top.$callback(\"$output\")}catch(e){}</script></body></html>";
} else {
    header('Content-Type: text/plain; charset=utf-8');
    echo $output;
}

?>

2 个答案:

答案 0 :(得分:1)

如果您希望URL唯一标识文档,请将url字段定义为uniqueKey。如果您将id字段定义为uniqueKey,但使用不同的ID提交相同的网址,则Solr无法知道这些文档是同一个对象。

另一种选择是使用id字段实际引用唯一的URL,无论是哈希还是数据库。

答案 1 :(得分:0)

非常感谢MatsLindh,

我已经知道该怎么做了。

首先,我改变了:

 $url = 'http://'. $SOLR_SERVER .':8983/solr/'. $CORE .'/update/csv?fieldnames=url,keywords,description,title&commit=true';

致:

$url = 'http://'. $SOLR_SERVER .':8983/solr/'. $CORE .'/update/csv?fieldnames=id,keywords,description,title&commit=true';

并添加了

<copyField source="id" dest="url"/>

下的

  <field name="description" type="strings"/>
  <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
  <field name="keywords" type="strings"/>
  <field name="title" type="strings"/>
  <field name="url" type="strings"/>
在托管架构中

我按照你的建议使用copyField将id复制到url。 它现在正常工作,并且没有显示重复项。

所以,改变的是,我让上传者将url更新为id,并使用copyField将其复制到url字段。