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

chi*_*rag 4 elasticsearch

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

"from" : 0, "size" : 50,
"query": {
    "match": {
        "my_attachment.content": req.params.name
     }
}
Run Code Online (Sandbox Code Playgroud)

但结果需要20-30秒.这是非常缓慢的反应.那么我需要做些什么来快速回应?任何的想法?

这是映射:

"my_attachment": {
                  "type": "attachment",
                  "fields": {
                     "content": {
                        "type": "string",
                        "store": true,
                        "term_vector": "with_positions_offsets"
                     }
                 }
}
Run Code Online (Sandbox Code Playgroud)

And*_*fan 5

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

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

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

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

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

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