18


6

SOLRインデックスの特定のフィールドを更新する

記事の検索にsolrを使用したい

私は3つのテーブルがあります:

  1. グループ(id、グループ名)

  2. ArticleBase(id、groupId、その他のフィールド)

  3. 記事(id、articleBaseId、タイトル、日付、…​)

solr schema.xmlファイルでは、ArticleBaseテーブル(solrで1つのインデックスを使用するため)と混合したすべての記事フィールドを次のように定義します:(id、articleBaseId、groupId、…​)

問題:管理者はグループ(ArticleBase)を変更したいので、solrのすべてのインデックス付き記事を更新(または置換)する必要があります。 右 ? + solrインデックスでのみgroupIdを更新できますか?

解決策がありますか?

:Articleテーブルには2億件以上の記事が含まれており、インデックスのみにsolrを使用しています(記事ID以外のフィールドデータは保存しません)

5 Answer


34


Solrは個々のフィールドの更新をまだサポートしていませんが、https://issues.apache.org/jira/browse/SOLR-139 [これに関するJIRAの問題](この記事の執筆時点でほぼ3歳)。

これが実装されるまで、ドキュメント全体を更新する必要があります。

  • UPDATE *:Solr 4以降では、これが実装されています。http://wiki.apache.org/solr/UpdateXmlMessages#Optional_attributes_for_.22field.22 [ドキュメントはこちら]。


15


Solr 4.0の「部分的なドキュメントの更新」機能については、http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ [このドキュメント]を参照してください。

Solr 4.0は現在最終版であり、実稼働に対応しています。

この機能により、フィールドを更新したり、multiValuedフィールドに値を追加することもできます。

マウリシオは2010年の回答に正しかったのですが、これが今日の状況です。


4


SolrPHPは、Solrの特定のフィールドを更新する方法を提供していません。

ただし、特定のフィールドを更新するには、PHPでCurl呼び出しを行うことができます。

 $docId,
    $solrFieldName => array(
        'set' => $solrFieldValue
    )
);
$update = json_encode(array($update));

// Create curl resource and URL
$ch = curl_init('http://'.SOLR_HOSTNAME.':'.SOLR_PORT.'/'.SOLR_COLLECTION.'/update?commit=true');

// Set Login/Password auth (if required)
curl_setopt($ch, CURLOPT_USERPWD, SOLR_LOGIN.':'.SOLR_PASSWORD);

// Set POST fields
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $update);

// Return transfert
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Set type of data sent
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));

// Get response result
$output = json_decode(curl_exec($ch));

// Get response code
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Close Curl resource
curl_close($ch);

if ($responseCode == 200)
{
    echo 'SOLR: Updated successfully field '.$solrFieldName.' for id:'.$docId.' (query time: '.$output->responseHeader->QTime.'ms).';
}
else
{
    echo ('SOLR: Can\'t update field '.$solrFieldName.' for id:'.$docId.', response ('.$responseCode.') is: '.print_r($output,true));
}

このコードを使用してJSONで更新します。XMLでデータを提供することもできます。


1


私のソリューションは次のようなものでした:

$client = new SolrClient($options);
$query = new SolrQuery();
// Find old Document
$query->setQuery('id:5458');
$query->setStart(0);
$query->setRows(1);
$query_response = $client->query($query);
// I had to set the parsemode to PARSE_SOLR_DOC
$query_response->setParseMode(SolrQueryResponse::PARSE_SOLR_DOC);
$response = $query_response->getResponse();
$doc = new SolrInputDocument();
// used the getInputDocument() to get the old document from the query
$doc = $response->response->docs[0]->getInputDocument();
if ($response->response->numFound) {
    $second_doc = new SolrInputDocument();
    $second_doc->addField('cat', "category123");
// Notice I removed the second parameter from the merge()
    $second_doc->merge($doc);
    $updateResponse = $client->addDocument($second_doc);
    $client->commit();
}


0


部分的な更新については、このhttps://lucene.apache.org/solr/guide/6_6/updating-parts-of-documents.html[documentation]を参照してください。 更新を行うには、置換するか、特定のフィールドに値を追加します(リストなど)。ただし、この場合は必要ありません