web-dev-qa-db-ja.com

新しいフィールドを既存のドキュメントに更新します

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

ID=99999
Field1:text
Field2:text

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

ID=99999
Field3:text

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

ID=99999
Field3:text

SolrWikiでこれを読みました

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

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

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

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

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

宜しくお願いします

11

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

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

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

10
Fuxi

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"
 }
}

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

9
coderman

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"
}
2
kanishka vatsa