web-dev-qa-db-ja.com

Elasticsearchでのデータのインポートと更新

SQLServerの複数のテーブルにまたがるデータを含む既存の検索機能があります。これによりDBに大きな負荷がかかるため、このデータを検索するためのより良い方法を見つけようとしています(あまり頻繁には変更されません)。 120万件のレコードを含むインポートを使用して、LogstashとElasticsearchで約1週間作業してきました。私の質問は基本的に、「「主キー」を使用して既存のドキュメントを更新するにはどうすればよいですか?」

CSVデータファイル(パイプ区切り)は次のようになります。

369|90045|123 ABC ST|LOS ANGELES|CA
368|90045|PVKA0010|LA|CA
367|90012|20000 Venice Boulvd|Los Angeles|CA
365|90045|ABC ST 123|LOS ANGELES|CA
363|90045|ADHOCTESTPROPERTY|DALES|CA

私のlogstash設定は次のようになります:

input {
  stdin {
    type => "stdin-type"
  }

  file {
    path => ["C:/Data/sample/*"]
    start_position => "beginning"
  }
}

filter {
  csv {
    columns => ["property_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

output {
  elasticsearch {
    embedded => true
    index => "samples4"
    index_type => "sample"
  }
}

Elasticsearchのドキュメントは、次のようになります。

{
   "_index": "samples4",
   "_type": "sample",
   "_id": "64Dc0_1eQ3uSln_k-4X26A",
   "_score": 1.4054651,
   "_source": {
   "message": [
      "369|90045|123 ABC ST|LOS ANGELES|CA\r"
   ],
   "@version": "1",
   "@timestamp": "2014-02-11T22:58:38.365Z",
   "Host": "[Host]",
   "path": "C:/Data/sample/sample.csv",
   "property_id": "369",
   "postal_code": "90045",
   "address_1": "123 ABC ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}

Ithinkは、_idフィールドの一意のIDをproperty_idの値に置き換えたいと考えています。後続のデータファイルには更新が含まれるという考え方です。以前のバージョンを保持する必要はなく、ドキュメントにキーを追加または削除することもありません。

Elasticsearch出力のdocument_id設定は、そのフィールドの値を_idに入れません(「property_id」に入れて、1つのドキュメントのみを保存/更新します)。私はここで何かが足りないことを知っています。私は間違ったアプローチを取っているだけですか?

編集:動作中!

@rutterの提案を使用して、output構成を次のように更新しました。

output {
  elasticsearch {
    embedded => true
    index => "samples6"
    index_type => "sample"
    document_id => "%{property_id}"
  }
}

現在、ドキュメントは期待どおりにデータフォルダに新しいファイルをドロップすることで更新されています。 _idproperty_idは同じ値です。

{
   "_index": "samples6",
   "_type": "sample",
   "_id": "351",
   "_score": 1,
   "_source": {
   "message": [
      "351|90045|Easy as 123 ST|LOS ANGELES|CA\r"
   ],
   "@version": "1",
   "@timestamp": "2014-02-12T16:12:52.102Z",
   "Host": "TXDFWL3474",
   "path": "C:/Data/sample/sample_update_3.csv",
   "property_id": "351",
   "postal_code": "90045",
   "address_1": "Easy as 123 ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}
17

コメントからの変換:

同じIDで別のドキュメントを送信することでドキュメントを上書きできますが、デフォルトでランダム化されたIDを取得するため、以前のデータでは扱いにくい場合があります。

出力プラグインの document_id field を使用してIDを設定できますが、フィールド名ではなくリテラル文字列を取ります。フィールドの内容を使用するには、%{property_id}などの sprintf形式の文字列 を使用できます。

このような何か、例えば:

output {
  elasticsearch {
    ... other settings...
    document_id => "%{property_id}"
  }
}
13
rutter

宣言者-私はESLの作者です
elasticsearch_loader を使用して、psvファイルをelasticsearchにロードできます。
_ idフィールドを設定するには、-id-field = property_idを使用できます。例えば:
elasticsearch_loader --index=myindex --type=mytype --id-field=property_id csv --delimiter='|' filename.csv

1
MosheZada

構成を次のように変更してみましたか?

filter {
  csv {
    columns => ["_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

Property_idに_idという名前を付けると、インデックス作成中に使用されるはずです。

0
Akshay