2012-06-13 22 views
15

私はelasticsearchを使い始めています。私たちの要件は、何千ものPDFファイルのインデックスを作成する必要があるため、インデックスの作成に苦労しています。Elasticsearch解析PDFをインデックス付けしようとすると例外エラーが発生する

添付ファイルタイププラグインがインストールされ、応答が得られました:Installed mapper-attachments

Attachment Type in Action tutorialに続きますが、プロセスがハングしてエラーメッセージをどのように解釈するのか分かりません。同じ場所にハングするgistも試しました。

$ curl -X POST "localhost:9200/test/attachment/" -d json.file 
{"error":"ElasticSearchParseException[Failed to derive xcontent from (offset=0, length=9): [106, 115, 111, 110, 46, 102, 105, 108, 101]]","status":400} 

詳細:

json.fileは(指示に従って)埋め込まれたBase64でのPDFファイルが含まれています。ファイルの最初の行は、(とにかく私には)が正しい表示されます:{"file":"JVBERi0xLjQNJeLjz9MNCjE1OCAwIG9iaiA8 ...

私は多分json.fileが無効であるか、多分elasticsearch場合だけ、正しくPDFファイルを解析するように設定されていないかどうかわからないんだけど? !?

エンコーディング - ここでは、(チュートリアルに従って)json.fileにPDFをコードしている方法は次のとおりです。また、試してみました

coded=`cat fn6742.pdf | perl -MMIME::Base64 -ne 'print encode_base64($_)'` 
json="{\"file\":\"${coded}\"}" 
echo "$json" > json.file 

coded=`openssl base64 -in fn6742.pdf 

ログ:

[2012-06-07 12:32:16,742][DEBUG][action.index    ] [Bailey, Paul] [test][0], node[AHLHFKBWSsuPnTIRVhNcuw], [P], s[STARTED]: Failed to execute [index {[test][attachment][DauMB-vtTIaYGyKD4P8Y_w], source[json.file]}] 
org.elasticsearch.ElasticSearchParseException: Failed to derive xcontent from (offset=0, length=9): [106, 115, 111, 110, 46, 102, 105, 108, 101] 
    at org.elasticsearch.common.xcontent.XContentFactory.xContent(XContentFactory.java:147) 
    at org.elasticsearch.common.xcontent.XContentHelper.createParser(XContentHelper.java:50) 
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:451) 
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:437) 
    at org.elasticsearch.index.shard.service.InternalIndexShard.prepareCreate(InternalIndexShard.java:290) 
    at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:210) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:532) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1.run(TransportShardReplicationOperationAction.java:430) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 

誰かが私が行方不明または間違っているものを見るのを助けることができると願っていますか?

答えて

19

次のエラーは、問題の原因を示しています。

Failed to derive xcontent from (offset=0, length=9): [106, 115, 111, 110, 46, 102, 105, 108, 101] 

UTF-8コードは[106、115、111、...]あなたは、インデックス文字列 "json.file" の代わりに、ファイルの内容にしようとしていることを示しています。

ファイルの内容をインデックスするには、単にファイル名の前に文字「@」を追加します。

curl -X POST "localhost:9200/test/attachment/" -d @json.file 
+0

ああ、あなたは正しいです!ご協力いただきありがとうございます!しかし、今はファイル名の前に '@'を追加しようとしましたが、ログに出力されずにハングします。シェルを元に戻すには* ctrl-C *が必要です。何か案は?ログをより役立つようにする方法がありますか? – Meltemi

+0

jstackを実行して、どこがハングするのか確認できますか? – imotov

+0

私は同じ過ちがありました。ありがとうございました! – ssoto

3

それは考えwould'a「ヘッドレス」サーバー...上でJavaアプリを実行する前に、export ES_JAVA_OPTS=-Djava.awt.headless=trueに必要なのですが判明!?!

+1

これは、エラーが消えるだけであることに注意する価値があります。 @ imotovの答えはおそらくこの問題の正解です。 「xcontentの取得に失敗しました」というエラーがポップアップする別の理由は、空のペイロードがエラスティックに渡されたときです。 – tester

関連する問題