2016-07-09 2 views
1

Я только начал использовать Solr 6.0 на днях и имел скрипт для обновления индекса Solr с помощью php-скрипта с использованием curl. Но сейчас есть дубликаты записей, обновленные с помощью скрипта php ниже.Выдача обновления для Solr делает Duplicates

Схема прямо сейчас выглядит так: id (уникальное поле ключа), url, keywords, description, title.

Является ли это потому, что я не указал явное уникальное поле ключа в 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; 
} 

?> 

ответ

1

Если вы хотите, чтобы URL-адрес идентифицировал документ однозначно, определите поле url как ваш уникальныйKey. Если у вас есть поле id, определенное как ваш уникальныйKey, но отправляйте одинаковые URL-адреса с разными идентификаторами, Solr не может знать, что эти документы являются одним и тем же объектом.

Другой вариант - использовать поле id, чтобы действительно ссылаться на уникальный URL-адрес, либо как хэш, либо из вашей БД.

+0

Благодарим вас за ответ. Можно ли использовать SchemaAPI для изменения уникального ключа? Я попробовал curl -X POST -H 'Content-type: application/json' --data-binary '{"add-field": {"name": "url", "type": "string", "stored" : true, "uniqueKey": true}} 'http: // localhost: 8983/solr/core1/schema, но это не сработало. –

+0

Нет, это невозможно: https://issues.apache.org/jira/browse/SOLR-7242 - вы можете дублировать 'url' в поле 'id', чтобы взломать его сейчас. – MatsLindh

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 для копирования идентификатора в URL-адрес, как вы предложили. Теперь он работает нормально, и дубликаты не отображаются.

Итак, что изменилось, я сделал загрузчик обновил URL-адрес в id и использовал copyField, чтобы скопировать его в поле url.

Смежные вопросы