Elasticsearch:搜索具有大型文档(PDF,doc,txt)的索引的性能很慢

时间:2016-07-20 13:05:00

标签: elasticsearch

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

"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"
                     }
                 }
}

1 个答案:

答案 0 :(得分:5)

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

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

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

  

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

因此,如果您没有为索引禁用_source,那么将使用它并且不需要存储内容。快速获取也没有什么神奇之处,它与文档的大小和想要检索的数量密切相关。不使用store: true可能会略微改善时间。

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