如何在 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机制

Elasticsearch 字段限制超过 1000

ElasticSearch 的索引管理

Elasticsearch核心技术与实战-简介

Elasticsearch如何管理 Elasticsearch 文档中的嵌套对象

Elasticsearch 磁盘使用率超过警戒水位线,怎么办?