2016-07-23 25 views
2

私はインデックスをSQLデータベースと同期させるためにDataImportHandlerを使用しようとしています(これはかなりバニラなことです)。私のデータベースはかなり大きいので、このメソッドhttp://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImportを使って増分インポートを使用したいので、呼び出しはhttp://localhost:8983/solr/Items/dataimport?command=full-import&clean=falseの形式になります。これはアイテムを追加するためにはうまくいきます。カスタム完全インポートのSolr削除

私は彼らが削除されたときに伴い、アイテムテーブルから削除されたアイテムの主キーが含まれている私のデータベース内の別々のDeletedItemsテーブルを持っています。 DataImport呼び出しの一部として、私は

SELECT Id FROM DeletedItems WHERE WasDeletedOn > '${dataimporter.last_index_time}' 

の線に沿って、クエリに基づいて私のインデックスから関連する項目を削除することができることを望んでいたが、私はこれを行う方法を見つけ出すことはできません。上記のリンクは暗黙のうちにそれを暗示しています

この場合、deletedPkQueryも使用したい場合は、delta-importコマンドを実行する必要があることは明らかです。

上記のSQLクエリにdeletedPkQueryを設定しても動作しないようです。私はその後、deletedPkQueryはデルタインポートでしか動作しないので、同期プロセスの一環としてsolrサーバーに2つの要求を行うことを余儀なくされています。これは、操作が変更されるdataimporter.last_index_timeプロパティによってパラメータ化されているため正しく表示されません。どちらのステップも、必ず1つの「アトミック」アクションで実行する必要があります。何か案は?

答えて

0

deletedPkQueryは、delta-importへの通常の呼び出しの一部として実行されるため、何も2回実行する必要はありません(フルインポートを実行する場合、deletedPkQueryを実行する必要はありません。とにかくインポートします)。

deletedPkQueryは、メインクエリと同じ要素に設定する必要があります。フィールド名も正確に一致させ、deletedPkQueryによって生成されたidがメインクエリによって提供されたものと一致するようにしてください。

a minimal example on solr.plは、あなたがここに持っているのと同じdeleted_entries-テーブル構造を使用してフィールドをインポートし、削除するためのあります:

<entity 
    name="album" 
    query="SELECT * from albums" 
    deletedPkQuery="SELECT deleted_id as id FROM deletes WHERE deleted_at > '${dataimporter.last_index_time}'" 
> 

またdeleted_atフィールドのフォーマットはlast_index_timeした値に対して同等であることを確認してください。 The default isyyyy-MM-dd HH:mm:ss

...そして最後に、何も「前回のインデックス時間」初めてのインデックスが取り込まれているがありませんので、last_index_timeプロパティは、タスクが実行されて二時間前に利用可能でないことを覚えておいてください(しかしdeletedPkQueryはいけませんとにかくその前に走る)。

+0

返事をありがとうユニオンクエリを使用することができます。私はdelta-importを避けようとしていますが、deltaQueryクエリーで返された各PKのデータベースを呼び出しているようです(n + 1)。 Solrのドキュメントから:「注意:多くの場合、より効率的で、http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImportで説明されている構成を必要とせずに、Solrで文書を更新する代替の方法があります。彼らがそこで説明している方法は、増分インポートではうまく動作しますが、削除をどのように設定するのか分かりません。 –

+0

注:使用されている完全インポートですが、索引をクリアしない*ドキュメントを追加/更新するだけです –

+0

ああ、良い点です。私はその詳細を逃した。私は2つのコマンドを発行しなければならないと思います.1つは完全インポート、もう1つはデルタインポートで削除をトリガーします。フルインポートの削除は、通常、 'clean = true'を使って処理されます。 DeltaQueryViaFullImportで説明されている方法で削除を行うには、手動で削除フィールドを使用して処理しなければなりません。その後、deleteByQueryで削除するか、または削除をトリガーするデルタインポートクエリを通じて削除します。インポート間にいくつの文書を削除しますか? – MatsLindh

0

あなたはブーストを変更したり、フルインポートクエリのレコードセットから文書を削除することができ、インポートハンドラ特別なコマンドにこれらのコマンドで

https://wiki.apache.org/solr/DataImportHandler#Special_Commands

を使用する必要があります。 $ skipDocフィールドを使用して、ドキュメントが再度索引化されないようにし、$ deleteDocByIdフィールドでIDを繰り返す必要があることに注意してください。

あなたは

select 
    id, 
    text, 
    'false' as [$deleteDocById], 
    'false' as [$skipDoc] 
from [rows to update or add] 
Union Select 
    id, 
    '' as text, 
    id as [$deleteDocById], 
    true as [$skipDoc] 

やケース際

select 
    id, 
    text, 
    CASE 
    when deleted = 1 then id 
    else 'false' 
    END as [$deleteDocById], 
    CASE 
    when deleted = 1 then 'true' 
    else 'false' 
    END as [$skipDoc] 
    Where updated > ${dih.last_index_time} 
関連する問題