11

新しいフィールドを既存のドキュメントに更新する可能性はありますか?例:いくつかのフィールドを持つドキュメントがあります。

ID=99999
Field1:text
Field2:text

このドキュメントはすでにインデックスに含まれているので、古いデータなしでこのドキュメントに新しいフィールドを挿入します。

ID=99999
Field3:text

今のところ、古いドキュメントは削除され、IDを持つ新しいドキュメントが作成されます。したがって、ID 99999を検索すると、結果は次のようになります。

ID=99999
Field3:text

SolrWikiでこれを読みました

既存のドキュメントの特定のフィールドを更新するにはどうすればよいですか?

ドキュメントの特定のフィールドを更新したいのですが、それは可能ですか?>特定のドキュメントの1つのフィールドにインデックスを付けるだけで済みます。このためにすべてのドキュメントにインデックスを付ける必要がありますか?

いいえ、1つのドキュメントだけです。CMSがあり、1つのドキュメントを編集するとします。このドキュメントのインデックスを再作成する必要があるのは、ドキュメント全体(1つのフィールドだけではない)に対してaddsolrステートメントを使用する場合のみです。

Luceneでは、ドキュメントを更新するための操作は、実際には削除とそれに続く追加です。Luceneにはそのような「フィールドのみを更新する」セマンティクスがないため、完全なドキュメントを追加する必要があります。

それで、これに対する解決策はありますか?この機能は今後のバージョンで実装されますか(私は現在3.6.0を使用しています)。回避策として、既存のフィールドを収集し、新しいフィールドを追加して、ドキュメント全体を更新するスクリプトまたはアプリケーションを作成することを考えました。しかし、これはパフォーマンスを低下させると思います。他に何かアイデアはありますか?

よろしくお願いします

4

3 に答える 3

10

私はあなたに2つの答えがあります(多かれ少なかれ悪い):

  1. Solrのドキュメント内のファイルを更新するには、ドキュメント全体のインデックスを再作成する必要があります(ドキュメントID:99999内のField3を更新するには、すべてのフィールドの値を使用してそのドキュメントのインデックスを再作成する必要があります)
  2. Solr 4では、そのような機能を実装しましたが、条件があります。インデックスだけでなく、すべてのフィールドを格納する必要があります。何が起こっているのかというと、彼らは保存された値を使用し、バックグラウンドでドキュメントのインデックスを再作成しています。興味がある場合は、それに関する素晴らしい記事があります:http ://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/このソリューションには明らかな欠陥があり、それはすべてのフィールドを保存するときのインデックス。

これがあなたの問題に役立つことを願っています。他にご不明な点がございましたら、お問い合わせください

于 2012-08-03T09:13:16.767 に答える
9

これはSolr4で行うことができます。たとえば、次のドキュメントを検討してください。

{
 "id": "book123",
 "name" : "Solr Rocks"
}

ドキュメントに作成者フィールドを追加するために、フィールド値は「set」属性とフィールド値を持つjsonオブジェクトになります

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '
[
 {"id"       : "book123",
  "author"   : {"set":"The Community"}
 }
]'

新しいドキュメント

$ curl http://localhost:8983/solr/get?id=book123

になります

{
 "doc" : {
    "id"    : "book123",
    "name"  : "Solr Rocks"
    "author": "The Community"
 }
}

Setは、作成者フィールドを追加または置換します。セットに加えて、increment(inc)およびadding(add)するオプションもあります

于 2013-07-10T20:16:49.883 に答える
3

Solr 4以降では、solrのフィールドを更新できます....インデックス全体のインデックスを再作成する必要はありません....さまざまな修飾子がサポートされています...。

set –特定の値を設定または置換するか、新しい値としてnullが指定されている場合は値を削除しますadd –リストに値を追加しますremove –リストから値(または値のリスト)を削除しますremoveregex –から削除します指定されたJava正規表現incに一致するリスト–数値を特定の量だけインクリメントします(負の値を使用してデクリメントします)

例 :

資料

{
 "id": "1",
 "name" : "Solr"
 "views" : "2"
}

今すぐ更新

$ curl http://localhost:8983/solr/demo/update -d '
[
 {"id"         : "1",
  "author"   : {"set":"Neal Stephenson"},
  "views"   : {"inc":3},
  }
]' 

結果は

{
 "id": "1",
 "name" : "Solr"
 "views" : "5"
 "author" : "Neal Stephenson"
}
于 2016-01-11T08:59:29.393 に答える