【问题标题】:Elasticsearch: Search Performance of index with large documents (PDF,doc,txt) is slowElasticsearch:具有大型文档(PDF,doc,txt)的索引的搜索性能很慢
【发布时间】:2016-07-29 14:00:23
【问题描述】:

我在使用 mapper-attachment 的弹性搜索中有 65000 个文档(pdf、docx、txt、..etc)索引。现在我想使用以下查询搜索该存储文档中的内容:

"from" : 0, "size" : 50,
"query": {
    "match": {
        "my_attachment.content": req.params.name
     }
}

但结果需要 20-30 秒。这是非常缓慢的反应。那么我该怎么做才能快速响应?有什么想法吗?

这里是映射:

"my_attachment": {
                  "type": "attachment",
                  "fields": {
                     "content": {
                        "type": "string",
                        "store": true,
                        "term_vector": "with_positions_offsets"
                     }
                 }
}

【问题讨论】:

  • 你需要给我们更多的信息才能继续。您是否有可供索引共享的映射?你想在什么硬件上运行它?您分配了多少内存供 Elasticsearch 使用?
  • 映射类型为“附件”。我有 8gb RAM,所以我将 4gb 分配给弹性搜索。你还想知道什么..?它是在附件文件中搜索(如pdf、docsx等)
  • 您的文档大约有多大?几个 KB 或更多像 MB?你有多少个节点?每个索引有多少个索引和多少个分片(主/副本)?
  • KB 和 MB。我有一个索引和五个分片,没有副本。
  • 多少个 CPU 内核以及查询行为是什么? (多个并发请求或仅执行一次查询以供您测试)什么 ES 版本?

标签: elasticsearch


【解决方案1】:

由于您的机器有 4 个 CPU 和索引 5 个分片,我建议切换到 4 个主分片,这意味着您需要重新索引。采用这种方法的原因是,在任何给定时间,一次查询的执行都将使用 4 个内核。对于其中一个分片,查询需要等待。要在查询时平均分配负载,请使用 4 个主分片(=CPU 内核数),这样当您运行查询时,CPU 级别的争用不会过多。

此外,通过提供curl localhost:9200/your_documents_index/_stats 的输出,我看到“获取”部分(从分片中检索文档)平均每次操作需要 4.2 秒。这可能是由于拥有非常大的文档或检索了大量文档的结果。 size: 50 不是一个很大的数字,但结合大文档会使查询返回结果的时间更长。

content 字段(其中包含实际文档的字段)具有 store: true,如果您想要突出显示,文档说明

为了执行突出显示,需要字段的实际内容。如果存储了相关字段(在映射中将store 设置为true),则将使用该字段,否则将加载实际的_source,并从中提取相关字段。

因此,如果您没有为索引禁用_source,那么将使用该索引并且不需要存储内容。此外,更快的获取也没有什么魔力,它与您的文档有多大以及您想要检索多少密切相关。不使用store: true 可能会稍微缩短时间。

从节点统计信息 (curl -XGET "http://localhost:9200/_nodes/stats") 来看,没有迹象表明该节点存在内存或 CPU 问题,所以一切都归结为我之前的建议。

【讨论】:

  • 但为了突出显示,我必须设置“store: true”,因为从 _source 突出显示会在“base64”中突出显示结果。所以为了突出显示, store: true 是必要的。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多