当前位置: 首页 > 面试题库 >

您如何在Tyre的Elasticsearch中索引附件?

谯嘉胜
2023-03-14
问题内容

难以通过 Tire* 宝石索引 Elasticsearch 的附件类型。无法正确设置附件。 *type

我已经采用了来自Tyre gem的ActiveModelIntegration示例,并添加了一个字段filename,以引用我希望与该记录建立索引的本地文件系统上PDF的名称。

#app/models/article.rb
class Article < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  attr_accessible :title, :content, :published_on, :filename

  mapping do
    indexes :id, :type =>'integer'
    indexes :title
    indexes :content
    indexes :published_on, :type => 'date'
    indexes :attachment, :type => 'attachment' 
  end

  def to_indexed_json
    to_json(:methods => [:attachment])
  end

  def attachment
    if filename.present?
       path_to_pdf = "/Volumes/Disk41402/test_proj/sample_pdfs/#{filename}.pdf"
       Base64.encode64(open(path_to_pdf) { |pdf| pdf.read })
    end
  end
end

FWIW-PDF似乎已添加到索引:

$ curl -XGET 'http://localhost:9200/articles/_all/2?pretty=true'  
{
  "_index" : "articles",
  "_type" : "article",
  "_id" : "2",
  "_version" : 1,
  "exists" : true, "_source" : {"content":"Consectetur adipisicing elit, sed do eiusmod tempor incididunt. working?","created_at":"2012-06-21T17:19:03Z","filename":"sample2","id":2,"published_on":"2012-06-20","title":"Two","updated_at":"2012-06-28T00:00:59Z","attachment":"JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAg\nUiAvRmlsdG...  ... ...4+CnN0YXJ0eHJlZgo4\nNTAzCiUVPRgo=\n"
}
}

但是附件类型仍然"type" : "string"是应该的"type" : "attachment"

$ curl -XGET 'http://localhost:9200/articles/_mapping?pretty=true'
{
  "articles" : {
    "article" : {
      "properties" : {
        "attachment" : {
          "type" : "string"
        },
        "content" : {
          "type" : "string"
        },
        "created_at" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "filename" : {
          "type" : "string"
        },
        "id" : {
          "type" : "long"
        },
        "published_on" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "title" : {
          "type" : "string"
        },
        "updated_at" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        }
      }
    }
  }
}

我尝试重建索引,rake environment tire:import CLASS=Article FORCE=true但是类型仍然是字符串。有人看到我在搞砸吗?

日志 (不确定“无处理程序”是什么意思!?):

[2012-06-28 17:30:58,711][INFO ][cluster.metadata         ] [Kofi Whitemane] [articles] deleting index
[2012-06-28 17:30:58,765][WARN ][cluster.metadata         ] [Kofi Whitemane] [articles] failed to create
org.elasticsearch.index.mapper.MapperParsingException: mapping [article]
    at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$1.execute(MetaDataCreateIndexService.java:263)
    at org.elasticsearch.cluster.service.InternalClusterService$2.run(InternalClusterService.java:211)
    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)
Caused by: org.elasticsearch.index.mapper.MapperParsingException: No handler for type [attachment] declared on field [attachment]
    at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:259)
    at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parse(ObjectMapper.java:217)
    at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:161)
    at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:271)
    at org.elasticsearch.index.mapper.MapperService.add(MapperService.java:174)
    at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$1.execute(MetaDataCreateIndexService.java:260)
    ... 4 more
[2012-06-28 17:30:58,805][INFO ][cluster.metadata         ] [Kofi Whitemane] [articles] creating index, cause [auto(bulk api)], shards [5]/[1], mappings []
[2012-06-28 17:30:58,891][INFO ][cluster.metadata         ] [Kofi Whitemane] [articles] update_mapping [article] (dynamic)

问题答案:

您是否安装了mapper附件插件?

请参阅elasticsearch.org上的教程。



 类似资料:
  • 问题内容: 我试图检查elasticsearch 6.2.1的RestHighLevelClient中是否存在索引 目前我正在使用以下代码 它工作正常,但我想找到一些相关方法,例如 elasticsearch6.2.1 任何帮助都非常感谢。 问题答案: 在高级REST客户端(可能从6.3版本开始)支持此功能之前,您可以通过使用低级REST客户端并向您的索引名称发出HEAD HTTP请求来 实现此目

  • 问题内容: 我是Elasticsearch的新手,我在这里阅读https://www.elastic.co/guide/zh- cn/elasticsearch/plugins/master/mapper- attachments.html ,在Elasticsearch 5.0.0中已弃用了mapper-attachments插件。 我现在尝试使用新的摄取附件插件为pdf文件编制索引并上传附件。

  • 问题内容: 我正在使用Solr进行索引和搜索。现在,我的新的数据被索引上elasticsearch。如何使用来自Elasticsearch的Solr索引进行组合搜索? 由于Solr和elasticsearch都是基于Apache Lucene 构建的,因此必须有一种方法/插件来使用Elasticsearch的Solr索引,对吗? 我的尝试: 我为此找到了一条河,但是elasticsearch从1.

  • 问题内容: 我曾经这样搜索: 但用户包含这样的用户a,b,c: 是第一个索引,是类型。 如何在此查询中增加类型?最好加上示例代码,谢谢。 问题答案: 您可以使用术语查询来增强索引类型。 首先创建一些测试数据(e1,e2,e3是类型,而test是索引名称): 现在将术语查询与按类型自定义增强一起使用: 它将产生如下结果:

  • 问题内容: 我有两个必须分开的索引: 我将如何在搜索中“联接”这两个表,以使其返回以下内容: 问题答案: 正如您在其他问题中回答的那样,没有什么可以阻止您在建立索引时将名称存储在每个文档中,同时仍然具有包含数据的专用索引。请记住,这都是关于巧妙地对数据进行规范化,以便每个文档都可以根据需要实现“自包含”。 该解决方案的优点是每个订单商品都是完全独立的,您可以对其进行分组/汇总以获取给定订单的所有商

  • 问题内容: 我已经设置了索引。我不时向其推送新文档。 我只想在所有文档都编入索引后回答我的查询。我怎样才能做到这一点? 问题答案: 在ES 2中,您可以在为新文档建立索引后立即调用API,但是不建议在生产环境中使用它,因为这可能会降低群集的性能。 在ES5中,您将能够使用发送索引查询,并且ES仅在准备好搜索新文档时才响应。