我在弹性搜索中使用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"
}
}
}
答案 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问题,所以一切都归结为我以前的建议。