gpt4 book ai didi

elasticsearch - 如何查询嵌套列表中的项目?

转载 作者:行者123 更新时间:2023-12-03 01:44:07 24 4
gpt4 key购买 nike

我使用Elasticsearch来存储系统漏洞。现在我的典型输入是

{
_id: somenadomid
_source: {
"ip": "10.10.10.10",
"vuln_name": "v1",
"vuln_type": 1
}

这种方法的优点是简化了查询(“具有类型1的漏洞的机器数量”->聚合,“漏洞数量”- query_all搜索和关联的 total值,...)。

它也有缺点,特别是:
  • 信息大量分解:关于一个主机的信息被复制到所有漏洞
  • 与漏洞一样多的行,而不是主机(平均多出50倍)
  • 自然的容器是“主机”而不是“漏洞”-可以更轻松地更新,删除等。

  • 因此,我正在考虑将方案更改为“主机”基础:
    {
    _id: machine1
    _source: {
    "ip": "10.10.10.10",
    "vuln": [
    {
    "name": "v1",
    "type": 1
    },
    {
    "name": "v2",
    "type": 1
    }
    ]
    }

    我遇到的问题是,我仍然从根本上查询漏洞,并且不知道如何在查询中“爆炸”漏洞。

    具体来说(我相信我的问题会在这一系列查询中引起注意),如何查询
  • type 1的漏洞总数(不是主机-每个主机可以有多个类型为1的漏洞,基本查询将检索条目,即主机)
  • 与上面相同,但是对漏洞名称进行了一些过滤(例如,type中“带有Microsoft的name 1的漏洞数量”)-过滤基于漏洞的功能,而不是主机的功能)
  • 最佳答案

    为了给您一个简单的概述,
    在Elasticsearch中,您有两种管理嵌套数据的方法,可以使用嵌套对象或内部对象,它们在后台是完全不同的。

    嵌套类型是对象数据类型的特殊版本,它允许相互独立地对对象数组进行索引和查询。

  • 嵌套文档彼此存储在同一Lucene块中,这有助于提高读取/查询性能。

    读取嵌套文档比同等的父/子更快。

    更新嵌套文档(父级或嵌套子级)中的单个字段会强制ES重新为整个嵌套文档编制索引。对于大型嵌套文档而言,这可能会非常昂贵
    不可能“交叉引用”嵌套文档
    最适合不经常更改的数据

  • 内部对象是嵌入到父文档中的对象。
  • 简单,快速,高效仅当一对一关系时适用
    保持不需要特殊查询嵌套

  • 请查看以下链接,以进一步了解内部对象和嵌套对象之间的区别。

    https://www.elastic.co/blog/managing-relations-inside-elasticsearch

    为了查询和汇总(获取总数),请查看以下链接:

    查询: https://www.elastic.co/guide/en/elasticsearch/guide/master/nested-objects.html

    集合体:
    https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-aggregation.html

    关于elasticsearch - 如何查询嵌套列表中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45432661/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com