2012-02-08 72 views
7

solrで大量のドキュメントを頻繁に更新する必要があります。たとえば、user_id = 5の場合は "online" = trueと設定します。しかし、httpハンドラによる索引付けの速度は非常に遅いです。 Solrサポートは、クエリでドキュメントを削除しますが、クエリで更新する方法はありますか?クエリによるSolrインデックスの更新

+0

このトピックに関する解決済みの問題、および解決できない理由は、https://issues.apacheです。org/jira/browse/SOLR-7490 – cheffe

答えて

10

残念ながら、クエリによる更新のような機能はありません。ドキュメントを完全に再発行する必要なくドキュメントを更新できるようにする新機能のように、本当に便利です。そのために5歳のjira issueがあります。今のところ更新されたフィールドでドキュメントを再提出するだけで、同じuniqueKeyを使用すると上書きされます(削除済み+再挿入されたことを意味します)。

ところで、更新するドキュメントごとにhttpリクエストを行っていますか? javannaが答えたようSolrには、また、あなたが個々のフィールドを更新することはできませんので、クエリによって更新するすべての施設が、そこではありません

<add> 
    <doc> 
    <field name="employeeId">05991</field> 
    <field name="office">Bridgewater</field> 
    </doc> 
    <doc> 
    <field name="employeeId">05992</field> 
    <field name="office">Bridgewater</field> 
    </doc> 
    <doc> 
    <field name="employeeId">05993</field> 
    <field name="office">Bridgewater</field> 
    </doc> 
</add> 
1

:はいた場合、あなたはそれが速く、このように一度に複数の文書を提出することができます索引に保管されている文書内にあるので、再提出は更新の唯一の方法です。私はあなたの更新がとても遅い理由については不思議です。以下は、更新速度を改善できるいくつかの方法です。

  • あなたは、個々の文書を更新した後コミットを発行する場合は、待つだけあなたは、インデックス内のドキュメントのバッチを更新した後に更新を発行します。

    コミットそれはバッチ内のインデックスに多くの変更を 行い、その後、最後にコミットコマンドを送信するのがベストですので、高価な操作することができます: Solr Tutorialから。 コミットと同じことを行う最適化コマンドもあります。すべてのインデックスセグメントを1つのセグメントにマージするだけで、 検索が高速になり、削除されたドキュメントは削除されます。 が削除されます。

  • ソフト・コミットまたは自動ソフト・コミットを使用して、更新の待ち時間を短縮します。詳細については、Solr WikiのNearRealtimeSearchページを参照してください。

+0

私は多くのHTTPリクエストのために更新プロセスが遅かったと思っていました...良い提案! – javanna

0

URLからのパラメータを受け入れる修正されたSQLクエリでDIHを使用します。 DIHとカスタムパラメータを使用する方法について

http://<host>:<port>/solr/dataimport?command=full-import&clean=false&user_id=5 

ドキュメント:Solr - DataImportHandler

1

することができますあなたがそのようなURLするuser_idのパラメータを追加している選択したユーザーのインデックスを再作成するためにその後

SELECT user_name, user_online FROM users WHERE user_id=${dataimporter.request.user_id} 

:SQLクエリは次のようになりますsolrサーバー側で作業を行う最小のSolrプラグインを開発してください。
は見ている: Discussion on Solr mailing list

6

クエリによって何の更新はまだありませんが、しかし、2012年から回答が古くなっています。今Solr 4.xにはhttps://wiki.apache.org/solr/Atomic_Updatesがあるので、元の文書にアクセスすることなく2つのステップでやりたいことができます。

+0

原子の更新には制限があります。 Erickがmaillistに言ったように、それはまだシーンの背後にある文書全体の更新です。アトミックな更新を使用している間にリストしていないドキュメントのフィールドは "保存"されていなければなりません。そのようなリストされていないフィールドの値を元のインデックスから取り出し、それらをリストアップされたフィールドと組み合わせてアトミックな更新を行い、ドキュメント全体をシーンの後ろに更新します。 (このコメントを書いている最中のSolrはv6.1.0です) –