【问题标题】:How do I manage an index with more than 10,000,000 documents in Elasticsearch for fast searching?如何在 Elasticsearch 中管理超过 10,000,000 个文档的索引以实现快速搜索?
【发布时间】: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 的搜索引擎也是这样检索数据的吗?

【问题讨论】:

    标签: python database elasticsearch


    【解决方案1】:

    您的问题有 2 个“级别”。

    第一层,字面意思。为了让您的查询更快,请确保您使用location 的字段类型keyword,也可以尝试使用term 而不是match。另外,请查看Tune for search speed 文档。

    第二级虽然敦促着眼于大局。如果您无论如何要将数百万个文档加载到内存中,那么从原始 JSON 加载它们并将它们保存在内存中可能会更快?或者在需要时从 JSON 加载?或者为每个 location 创建几个 JSON 存储桶,并在需要时快速读取一个?

    或者也许您真的不需要一次加载所有文档并且可以批量处理结果?将所有数据加载到内存中不会扩展,如果数据量增长,您可能会耗尽内存。

    Elasticsearch 非常适合全文搜索、语言处理和聚合,但如果您将其用作简单存储,则开销会很大。

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 2014-08-07
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2015-05-23
      • 2017-11-25
      • 2017-10-21
      • 2023-04-10
      相关资源
      最近更新 更多