如何在 Elasticsearch 中管理超过 10,000,000 个文档的索引以实现快速搜索?
Posted
技术标签:
【中文标题】如何在 Elasticsearch 中管理超过 10,000,000 个文档的索引以实现快速搜索?【英文标题】:How do I manage an index with more than 10,000,000 documents in Elasticsearch for fast searching? 【发布时间】:2022-01-17 17:48:01 【问题描述】:我在我的 elasticsearch 服务器(localhost:9200) 中创建了一个索引,用于获取应用程序的日志文件。这些数据超过 25GB(JSON 数据),我花了将近 3 个小时将其从 Logstash 发送到 Elasticsearch。
根据http://localhost:9200/_cat/indices?v
的请求,可以看到我的索引有超过2200万个文档。
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open test i4nRcsZ8SJyjuKXpH2lI_A 1 1 22240500 0 11.5gb 11.5gb
当我搜索特定字段及其值时,ES 需要很长时间才能从我的索引中搜索并获取结果。我知道我的输出将包含超过 10,000 个文档,这就是为什么我在 python 中使用SCAN
函数而不是SEARCH
。
我选择 ES 的唯一原因是它需要很短的时间来提供输出,但在我的情况下,它需要几分钟,并且在大多数测试中我从 ES 收到超时错误。
query =
"_source" : ['full_log'],
"query" :
"match" :
"location" : "192.168.0.1"
rel = scan(client=es,
query=query,
scroll='1m',
index='test',
raise_on_error=True,
preserve_order=False,
clear_scroll=True)
如何提高搜索结果的时间?
NETFLIX 的搜索引擎也是这样检索数据的吗?
【问题讨论】:
【参考方案1】:您的问题有 2 个“级别”。
第一层,字面意思。为了让您的查询更快,请确保您使用location
的字段类型keyword,也可以尝试使用term
而不是match
。另外,请查看Tune for search speed 文档。
第二级虽然敦促着眼于大局。如果您无论如何要将数百万个文档加载到内存中,那么从原始 JSON 加载它们并将它们保存在内存中可能会更快?或者在需要时从 JSON 加载?或者为每个 location
创建几个 JSON 存储桶,并在需要时快速读取一个?
或者也许您真的不需要一次加载所有文档并且可以批量处理结果?将所有数据加载到内存中不会扩展,如果数据量增长,您可能会耗尽内存。
Elasticsearch 非常适合全文搜索、语言处理和聚合,但如果您将其用作简单存储,则开销会很大。
【讨论】:
以上是关于如何在 Elasticsearch 中管理超过 10,000,000 个文档的索引以实现快速搜索?的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch shardreplica与routing机制