首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在弹性搜索查询中将子对象视为父对象的字段

在弹性搜索查询中,将子对象视为父对象的字段是一种常见的需求,可以通过使用嵌套查询和映射关系来实现。

首先,需要在映射关系中定义子对象和父对象的关系。可以使用nested类型来定义子对象,并使用_parent字段来指定父对象的ID。例如:

代码语言:txt
复制
PUT /my_index
{
  "mappings": {
    "properties": {
      "parent_id": {
        "type": "keyword"
      },
      "child_objects": {
        "type": "nested",
        "properties": {
          "child_id": {
            "type": "keyword"
          },
          "child_value": {
            "type": "text"
          }
        }
      }
    }
  }
}

在上面的映射关系中,child_objects字段是一个嵌套对象,其中包含child_idchild_value两个字段。

接下来,可以使用嵌套查询来查询子对象的值,并将其视为父对象的字段。例如:

代码语言:txt
复制
GET /my_index/_search
{
  "query": {
    "nested": {
      "path": "child_objects",
      "query": {
        "match": {
          "child_objects.child_value": "some_value"
        }
      },
      "inner_hits": {}
    }
  }
}

在上面的查询中,nested查询指定了child_objects字段是一个嵌套对象,并且使用match查询来查询child_objects.child_value字段的值。inner_hits参数可以返回嵌套对象的详细信息,包括父对象的ID。

最后,可以使用聚合功能来统计查询结果的数量和分布情况。例如:

代码语言:txt
复制
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "parent_objects": {
      "terms": {
        "field": "parent_id"
      },
      "aggs": {
        "child_objects": {
          "nested": {
            "path": "child_objects"
          },
          "aggs": {
            "child_values": {
              "terms": {
                "field": "child_objects.child_value"
              }
            }
          }
        }
      }
    }
  }
}

在上面的查询中,size参数设置为0,表示不返回任何文档,只返回聚合结果。parent_objects聚合使用terms聚合来统计父对象的数量和分布情况,child_objects聚合使用nested聚合来指定子对象的路径,child_values聚合使用terms聚合来统计子对象的值的数量和分布情况。

总之,在弹性搜索查询中将子对象视为父对象的字段,可以通过使用嵌套查询和聚合功能来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

search(16)- elastic4s-内嵌文件:nested and join

从SQL领域来的用户,对于ES的文件关系维护方式会感到很不习惯。毕竟,ES是分布式数据库只能高效处理独个扁平类型文件,无法支持关系式数据库那样的文件拼接。但是,任何数据库应用都无法避免树型文件关系,因为这是业务模式需要的表现形式。在ES里,无论nested或join类型的数据,父-子关系的数据文件实际上是放在同一个索引index里的。在ES里已经没有数据表(doc_type)的概念。但从操作层面上ES提供了relation类型来支持父-子数据关系操作。所以,nested数据类型一般用来表达比较固定的嵌入数据。因为每次更新都需要重新对文件进行一次索引。join类型的数据则可以对数据关系的两头分别独立进行更新,方便很多。

01

python 操作es

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索引擎功能的库。但是 Lucene 仅仅只是一个库。为了利用它,你需要编写 Java 程序,并在你的 java 程序里面直接集成 Lucene 包。 更坏的情况是,你需要对信息检索有一定程度的理解才能明白 Lucene 是怎么工作的。Lucene 是 很 复杂的。 在上一篇博客中介绍了ElasticSearch的简单使用,接下来记录一下ElasticSearch的查询: #创建index索引 #创建索引,索引的名字是my-index,如果已经存在了,就返回个400, #这个索引可以现在创建,也可以在后面插入数据的时候再临时创建

05
领券