2017-07-17 6 views
1

「リソース」と呼ばれるフィールドの1つに、以下の2つの内部ドキュメントがあります。フィールド配列からテキストを抽出します

{ 
    "type": "AWS::S3::Object", 
    "ARN": "arn:aws:s3:::sms_vild/servers_backup/db_1246/db/reports_201706.schema" 
}, 
{ 
    "accountId": "934331768510612", 
    "type": "AWS::S3::Bucket", 
    "ARN": "arn:aws:s3:::sms_vild" 
} 

私はARNフィールドを分割し、最後の部分を取得する必要があります。好ましくはスクリプトフィールドを使用して、「reports_201706.schema」とする。私は、日時フィールドとそれにしようとした)

1)私はfiledsのリストをチェックして見つけた唯一の2つのエントリresources.accountIdをして

2 resources.type:私が試してみました何


スクリプトで書かれたオプション(式)で正しく機能しました。

doc['eventTime'].value 

3)しかし、同じことは他のテキストフィールドでは機能しません。

doc['eventType'].value 

このエラーを取得:

"caused_by":{"type":"script_exception","reason":"link error","script_stack":["doc['eventType'].value","^---- HERE"],"script":"doc['eventType'].value","lang":"expression","caused_by":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [eventType] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}}},"status":500} 

それは私がマッピングを変更する必要があるということです。オブジェクトのネストされた配列からテキストを抽出する他の方法はありますか?


更新:

"ebs_attach.png" のサンプルkibanaここに...

https://search-accountact-phhofxr23bjev4uscghwda4y7m.us-east-1.es.amazonaws.com/_plugin/kibana/

検索を訪問して、リソースのフィールドを確認してください。あなたは、私はいくつかの-どのようにそれをとして表示することができる場合、私はARNフィールドを分割し、再び最後の部分を抽出し、「ebs_attach.png」

する必要が

{ 
    "type": "AWS::S3::Object", 
    "ARN": "arn:aws:s3:::datameetgeo/ebs_attach.png" 
}, 
{ 
    "accountId": "513469704633", 
    "type": "AWS::S3::Bucket", 
    "ARN": "arn:aws:s3:::datameetgeo" 
} 

...このような2つのネストされた配列が表示されますスクリプトフィールドでは、バケット名とファイル名がディスカバリータブに並んで表示されます。つまり、2


アップデートは、私が発見]タブに新しいフィールドとして、このイメージに示すテキストを抽出しようとしています。

enter image description here

答えて

2

このためにスクリプトを使用することはできますが、インデックス時にこれらの種類の情報を抽出することを強くお勧めします。ここでは、フェイルセーフから離れた2つの例を示しましたが(異なるパスでテストする必要があるか、このフィールドがまったく見つからない場合)、始めるベースを提供する必要があります。

PUT foo/bar/1 
{ 
    "resources": [ 
    { 
     "type": "AWS::S3::Object", 
     "ARN": "arn:aws:s3:::sms_vild/servers_backup/db_1246/db/reports_201706.schema" 
    }, 
    { 
     "accountId": "934331768510612", 
     "type": "AWS::S3::Bucket", 
     "ARN": "arn:aws:s3:::sms_vild" 
    } 
    ] 
} 

# this is slow!!! 
GET foo/_search 
{ 
    "script_fields": { 
    "document": { 
     "script": { 
     "inline": "return params._source.resources.stream().filter(r -> 'AWS::S3::Object'.equals(r.type)).map(r -> r.ARN.substring(r.ARN.lastIndexOf('/') + 1)).findFirst().orElse('NONE')" 
     } 
    } 
    } 
} 

# Do this on index time, by adding a pipeline 
PUT _ingest/pipeline/my-pipeline-id 
{ 
    "description" : "describe pipeline", 
    "processors" : [ 
    { 
     "script" : { 
     "inline": "ctx.filename = ctx.resources.stream().filter(r -> 'AWS::S3::Object'.equals(r.type)).map(r -> r.ARN.substring(r.ARN.lastIndexOf('/') + 1)).findFirst().orElse('NONE')" 
     } 
    } 
    ] 
} 

# Store the document, specify the pipeline 
PUT foo/bar/1?pipeline=my-pipeline-id 
{ 
    "resources": [ 
    { 
     "type": "AWS::S3::Object", 
     "ARN": "arn:aws:s3:::sms_vild/servers_backup/db_1246/db/reports_201706.schema" 
    }, 
    { 
     "accountId": "934331768510612", 
     "type": "AWS::S3::Bucket", 
     "ARN": "arn:aws:s3:::sms_vild" 
    } 
    ] 
} 

# lets check the filename field of the indexed document by getting it 
GET foo/bar/1 

# We can even search for this file now 
GET foo/_search 
{ 
    "query": { 
    "match": { 
     "filename": "reports_201706.schema" 
    } 
    } 
} 
0

注:考慮 "リソース" 配列

NSArray *array_ARN_Values = [resources valueForKey:@"ARN"]; 

の一種である、それはあなたのために働くことを願っています!

+0

これは機能しませんでした。更新された質問をご覧ください。 – shantanuo

+0

リソースが一種の配列であるかどうかはどのように分かりますか?フィールドリストに「リソース」が表示されません。ただし、タイプ、リソースからのARNおよびaccountidパラメーターは索引付けされます。 – shantanuo

関連する問題