苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper万能框架(V2.3-含.netcore) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 370|回复: 2

[搜索引擎] 58-Elasticsearch嵌套对象查询

[复制链接]
发表于 2019-1-11 08:57:51 | 显示全部楼层 |阅读模式
嵌套对象查询

        由于嵌套对象 被索引在独立隐藏的文档中,我们无法直接查询它们。 相应地,我们必须使用 nested 查询 去获取它们:
[C#] 纯文本查看 复制代码
GET /my_index/blogpost/_search

{

  "query": {

    "bool": {

      "must": [

        {

          "match": {

            "title": "eggs" 

          }

        },

        {

          "nested": {

            "path": "comments", 

            "query": {

              "bool": {

                "must": [ 

                  {

                    "match": {

                      "comments.name": "john"

                    }

                  },

                  {

                    "match": {

                      "comments.age": 28

                    }

                  }

                ]

              }

            }

          }

        }

      ]

}}}


  • title 子句是查询根文档的。
  • nested 子句作用于嵌套字段 comments 。在此查询中,既不能查询根文档字段,也不能查询其他嵌套文档。
  • comments.name 和 comments.age 子句操作在同一个嵌套文档中。



nested 字段可以包含其他的 nested 字段。同样地,nested 查询也可以包含其他的 nested 查询。而嵌套的层次会按照你所期待的被应用。

nested 查询肯定可以匹配到多个嵌套的文档。每一个匹配的嵌套文档都有自己的相关度得分,但是这众多的分数最终需要汇聚为可供根文档使用的一个分数。

默认情况下,根文档的分数是这些嵌套文档分数的平均值。可以通过设置 score_mode 参数来控制这个得分策略,相关策略有 avg (平均值), max (最大值), sum (加和) 和 none (直接返回 1.0 常数值分数)。
[C#] 纯文本查看 复制代码
GET /my_index/blogpost/_search

{

  "query": {

    "bool": {

      "must": [

        {

          "match": {

            "title": "eggs"

          }

        },

        {

          "nested": {

            "path": "comments",

            "score_mode": "max", 

            "query": {

              "bool": {

                "must": [

                  {

                    "match": {

                      "comments.name": "john"

                    }

                  },

                  {

                    "match": {

                      "comments.age": 28

                    }

                  }

                ]

              }

            }

          }

        }

      ]

    }

  }

}



  • 返回最优匹配嵌套文档的 _score 给根文档使用。



    如果 nested 查询放在一个布尔查询的 filter 子句中,其表现就像一个 nested 查询,只是 score_mode 参数不再生效。因为它被用于不打分的查询中 — 只是符合或不符合条件,不必打分 — 那么 score_mode 就没有任何意义,因为根本就没有要打分的地方。

发表于 2019-1-11 13:57:17 | 显示全部楼层
发表于 2019-1-11 14:12:43 | 显示全部楼层
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1)

GMT+8, 2019-8-26 15:48

© 2017-2018

快速回复 返回顶部 返回列表