如何使用摄取附件插件在 Elasticsearch 5.0.0 中索引 pdf 文件?
How to index a pdf file in Elasticsearch 5.0.0 with ingest-attachment plugin?
我是 Elasticsearch 的新手,我在这里读到 https://www.elastic.co/guide/en/elasticsearch/plugins/master/mapper-attachments.html 映射器附件插件在 elasticsearch 5.0.0 中已弃用。
我现在尝试使用新的摄取附件插件为 pdf 文件编制索引并上传附件。
到目前为止我尝试过的是
curl -H 'Content-Type: application/pdf' -XPOST localhost:9200/test/1 -d @/cygdrive/c/test/test.pdf
但我收到以下错误:
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse"}],"type":"mapper_parsing_exception","reason":"failed to parse","caused_by":{"type":"not_x_content_exception","reason":"Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes"}},"status":400}
我希望 pdf 文件将被编入索引并上传。我做错了什么?
我还测试了 Elasticsearch 2.3.3,但映射器附件插件对此版本无效,我不想使用任何旧版本的 Elasticsearch。
您需要确保已使用以下内容创建 ingest 管道:
PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"indexed_chars" : -1
}
}
]
}
然后您可以使用您创建的管道对您的索引进行 PUT 而不是 POST。
PUT my_index/my_type/my_id?pipeline=attachment
{
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
}
在你的例子中,应该是这样的:
curl -H 'Content-Type: application/pdf' -XPUT localhost:9200/test/1?pipeline=attachment -d @/cygdrive/c/test/test.pdf
记住 PDF 内容必须是 base64 编码的。
希望对您有所帮助。
编辑 1
请务必阅读这些,它对我帮助很大:
编辑 2
此外,您必须安装 ingest-attachment 插件。
./bin/elasticsearch-plugin install ingest-attachment
编辑 3
请在创建 ingest 处理器(附件)之前,创建 index、map 与您将使用的字段,并确保您的 map 中有 data 字段(与 "field" 中的同名您的附件处理器),因此 ingest 将使用您的 pdf 内容处理并填写您的 data 字段。
我在摄取处理器中插入了indexed_chars选项,值为-1,所以你可以索引大的pdf文件。
编辑 4
映射应该是这样的:
PUT my_index
{
"mappings" : {
"my_type" : {
"properties" : {
"attachment.data" : {
"type": "text",
"analyzer" : "brazilian"
}
}
}
}
}
在这种情况下,我使用 brazilian 过滤器,但您可以删除它或使用您自己的过滤器。
我是 Elasticsearch 的新手,我在这里读到 https://www.elastic.co/guide/en/elasticsearch/plugins/master/mapper-attachments.html 映射器附件插件在 elasticsearch 5.0.0 中已弃用。
我现在尝试使用新的摄取附件插件为 pdf 文件编制索引并上传附件。
到目前为止我尝试过的是
curl -H 'Content-Type: application/pdf' -XPOST localhost:9200/test/1 -d @/cygdrive/c/test/test.pdf
但我收到以下错误:
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse"}],"type":"mapper_parsing_exception","reason":"failed to parse","caused_by":{"type":"not_x_content_exception","reason":"Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes"}},"status":400}
我希望 pdf 文件将被编入索引并上传。我做错了什么?
我还测试了 Elasticsearch 2.3.3,但映射器附件插件对此版本无效,我不想使用任何旧版本的 Elasticsearch。
您需要确保已使用以下内容创建 ingest 管道:
PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"indexed_chars" : -1
}
}
]
}
然后您可以使用您创建的管道对您的索引进行 PUT 而不是 POST。
PUT my_index/my_type/my_id?pipeline=attachment
{
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
}
在你的例子中,应该是这样的:
curl -H 'Content-Type: application/pdf' -XPUT localhost:9200/test/1?pipeline=attachment -d @/cygdrive/c/test/test.pdf
记住 PDF 内容必须是 base64 编码的。
希望对您有所帮助。
编辑 1 请务必阅读这些,它对我帮助很大:
编辑 2
此外,您必须安装 ingest-attachment 插件。
./bin/elasticsearch-plugin install ingest-attachment
编辑 3
请在创建 ingest 处理器(附件)之前,创建 index、map 与您将使用的字段,并确保您的 map 中有 data 字段(与 "field" 中的同名您的附件处理器),因此 ingest 将使用您的 pdf 内容处理并填写您的 data 字段。
我在摄取处理器中插入了indexed_chars选项,值为-1,所以你可以索引大的pdf文件。
编辑 4
映射应该是这样的:
PUT my_index
{
"mappings" : {
"my_type" : {
"properties" : {
"attachment.data" : {
"type": "text",
"analyzer" : "brazilian"
}
}
}
}
}
在这种情况下,我使用 brazilian 过滤器,但您可以删除它或使用您自己的过滤器。