解码 Elasticsearch 查询 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查询进行父子文档搜索

今天,让我们深入研究 has_child 查询和 has_parent 查询,这将帮助我们将 2 个不同的文档组合到一个索引中,从而使我们能够将它们与关系关联起来。 这样做会对我们搜索相关文档时有很大帮助。 在使用 has_child 及 has_parent 这种关系时,我们必须使用 join 数据类型。更多有关 join 数据类型的介绍,请参考文章 “Elasticsearch: Join 数据类型”。在实际的使用时,我们必须注意的一点是: join 不能跨索引,Elasticsearch 的重点在于速度,而传统 join 的运行速度太慢。 因此,子文档和父文档都必须位于相同的索引和相同的分片中。

了解亲子关系

Elasticsearch 中的父子关系涉及将一个索引中的文档作为父项与另一索引中的文档相关联。 这种关系对于数据组织需要分层结构、需要分层搜索的场景非常重要。 has_child 和 has_parent 查询为我们提供了在这些关系中轻松准确地导航和搜索的选项。

has_child 查询

has_child 查询允许我们根据关联子文档的内容搜索父文档。 当我们想根据孩子的属性对父母进行过滤或评分时,此查询主要有用。

句法

{
  "query": {
    "has_child": {
      "type": "child_type",
      "query": {
        "match": {
          "field": "value"
        }
      }
    }
  }
}

让我们考虑一下,我们的 “fruits” 索引中有父子关系,其中每个 fruit 文档都是父文档,这些水果的 nutritional_info 信息存储为子文档。 has_child 查询可用于查找具有特定营养价值的水果。

{
  "query": {
    "has_child": {
      "type": "nutritional_info",
      "query": {
        "range": {
          "vitamin_c": {
            "gte": 20
          }
        }
      }
    }
  }
}
{
  "query": {
    "has_child": {
      "type": "nutritional_info",
      "query": {
        "range": {
          "vitamin_c": {
            "gte": 20
          }
        }
      }
    }
  }
}

在此示例中,我们正在搜索具有子文档(营养信息)的水果,其中维生素 C 含量大于或等于 20。

{
  "query": {
    "has_parent": {
      "parent_type": "parent_type",
      "query": {
        "term": {
          "field": "value"
        }
      }
    }
  }
}

在与我们上面使用的具有父子关系的 “Fruits” 索引相同的示例中,我们假设每个水果文档都是父文档,并且营养信息存储为子文档。 has_child 查询可用于查找具有特定营养价值的水果。 这是一个例子:

{
  "query": {
    "has_child": {
      "type": "nutritional_info",
      "query": {
        "range": {
          "vitamin_c": {
            "gte": 20
          }
        }
      }
    }
  }
}

在此示例中,我们正在搜索具有子文档(营养信息)的水果,其中维生素 C 含量大于或等于 20。

所以基本上 has_child 和 has_parent 查询只是彼此的关系。

实时用例:

分层数据建模

让我们考虑一个场景,我们正在对组织结构或产品类别等分层数据进行建模。 has_child 和 has_parent 查询使我们能够检索层次结构各个级别的相关信息,从而促进高效的数据导航。

内容过滤

在内容管理系统中,我们可能有代表文章的父文档和代表评论的子文档。 利用 has_child 查询,我们可以根据评论中的特定条件过滤文章,并为客户提供精致的搜索体验。

虽然 has_child 和 has_parent 查询为相关文档搜索提供了强大的选项,但我们应该始终小心常见问题,例如索引之间的映射不一致、较大层次结构的查询性能问题等。

为了最大限度地提高 has_child 和 has_parent 查询的有效性,我们应该确保始终遵循以下最佳实践。

  1. 索引设置:索引设置应配置为支持有效的父子关系。 根据用例适当调整 “index.mapping.single_type” 等设置。
  2. 查询优化:应使用缓存和过滤等查询优化技术来增强搜索性能。

因此,如果这是用于理解 has_child 和 has_parent 查询的入门知识,Elastic 的官方文档可以帮助我们更多地了解有关相同内容的更多详细信息。

更多阅读:Elasticsearch:在 Elasticsearch 中的 join 数据类型父子关系。


http://www.niftyadmin.cn/n/5313277.html

相关文章

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务,它能够帮助用户快速搭建网站、应用和服务&…

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例,记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有:Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

Objective-C中使用STL标准库Queue队列

1.修改.m文件为mm 2.导入queue头 #include<queue> 3.使用&#xff1a; #import <Foundation/Foundation.h> #include <cmath> #include <queue> using namespace std;int main(int argc, const char * argv[]) {autoreleasepool {NSLog("C标准…

I.MX6ULL开发笔记(三)——挂载NFS网络文件系统

0x01 网络文件系统 当我们在编译一个文件时&#xff0c;正常是在一个pc上编译好一个文件&#xff0c;之后丢到开发板上去运行。如果有了NFS网络文件系统&#xff0c;那么我们就可以在PC以及开发板上共享文件了。 网络文件系统&#xff0c;常被称为NFS&#xff08;Network Fil…

01-连接池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

Vant2组件库van-list+Toast下拉加载滚动条回顶问题

目录 List 列表 Toast 轻提示 解决方案 1、不使用 Toast 的 加载提示 2、修改调整 pointer-event 属性值 3、判断是否为第一次加载再使用 背景 &#xff1a; 移动端项目 开发时&#xff0c;有数据长列表展示的场景需求&#xff0c;此时就用到了 Vant2 组件库里面的 <v…

Java——判空方式ObjectUtils/CollectionUtils/StringUtils及区别

目录 前言一、ObjectUtils.isEmpty二、CollectionUtils.isEmpty三、StringUtils.isEmpty四、StringUtils.isBlank四、!null后续敬请期待 前言 Java——判空方式ObjectUtils/CollectionUtils/StringUtils及区别 一、ObjectUtils.isEmpty 可判断String、集合、基本数据类型等数…

C#,入门教程(12)——数组及数组使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(11)——枚举&#xff08;Enum&#xff09;的基础知识和高级应用https://blog.csdn.net/beijinghorn/article/details/123917587 数组是一种数据集合&#xff0c;是一组完全相同的、按顺序存放的数据。 需要记住数组的几个特征&…