首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回ElasticSearch中的部分嵌套文档

问返回ElasticSearch中的部分嵌套文档
EN

Stack Overflow用户
提问于 2013-05-28 09:30:40
回答 1查看 5K关注 0票数 9

我想搜索一个嵌套文档数组,并只返回那些符合特定条件的文档。

例如,映射如下:

代码语言:javascript
复制
{"book":
    {"properties":
        {
         "title":{"type":"string"},
         "chapters":{
                     "type":"nested",
                     "properties":{"title":{"type":"string"},
                                   "length":{"type":"long"}}
                                  }
                     }
          }
     }
}

所以,说我想找一个章节的标题是“结语”。并不是所有的书都有这样的一章,但是如果我使用嵌套的查询,我就会得到一本有这样一章的书中的所有章节。虽然我感兴趣的只是章节本身有这样的标题。

我主要关注的是i/o和净流量,因为可能有很多章节。

另外,是否有一种方法只检索嵌套文档,而不检索包含文档的文档?

EN

回答 1

Stack Overflow用户

发布于 2016-11-26 23:00:10

这是我偶然发现的一个很老的问题,所以我将展示两种不同的方法来解决这个问题。

让我们先准备索引和一些测试数据:

代码语言:javascript
复制
PUT /bookindex
{
  "mappings": {
    "book": {
      "properties": {
        "title": {
          "type": "string"
        },
        "chapters": {
          "type": "nested",
          "properties": {
            "title": {
              "type": "string"
            },
            "length": {
              "type": "long"
            }
          }
        }
      }
    }
  }
}

PUT /bookindex/book/1
{
  "title": "My first book ever",
  "chapters": [
    {
      "title": "epilogue",
      "length": 1230
    },
    {
      "title": "intro",
      "length": 200
    }
  ]
}

PUT /bookindex/book/2
{
  "title": "Book of life",
  "chapters": [
    {
      "title": "epilogue",
      "length": 17
    },
    {
      "title": "toc",
      "length": 42
    }
  ]
}

现在我们已经在Elasticsearch中获得了这些数据,我们可以使用inner_hits检索相关的命中信息。这种方法非常简单,但我更喜欢最后概述的方法。

代码语言:javascript
复制
# Inner hits query
POST /bookindex/book/_search
{
  "_source": false,
  "query": {
    "nested": {
      "path": "chapters",
      "query": {
        "match": {
          "chapters.title": "epilogue"
        }
      },
      "inner_hits": {}
    }
  }
}

inner_hits嵌套查询返回文档,其中每次命中都包含一个包含所有匹配文档(包括评分信息)的inner_hits对象。你可以看到响应。

对于这种类型的查询,我最喜欢的方法是使用带有嵌套聚合的已过滤子聚合,其中包含top_hits子聚合。查询如下:

代码语言:javascript
复制
# Nested and filter aggregation
POST /bookindex/book/_search
{
  "size": 0,
  "aggs": {
    "nested": {
      "nested": {
        "path": "chapters"
      },
      "aggs": {
        "filter": {
          "filter": {
            "match": { "chapters.title": "epilogue" }
          },
          "aggs": {
            "t": {
              "top_hits": {
                "size": 100
              }
            }
          }
        }
      }
    }
  }
}

top_hits子聚合负责实际检索嵌套文档,并支持from和size属性等。从文件中:

如果top_hits聚合器包装在nested或reverse_nested聚合器中,则将返回嵌套的hits。嵌套命中在某种意义上是隐藏的迷你文档,它们是常规文档的一部分,在映射中,嵌套字段类型已经被配置。如果top_hits聚合器包装在nested或reverse_nested聚合器中,则它能够取消隐藏这些文档。阅读有关嵌套类型映射中嵌套的更多信息。

弹性搜索的反应更漂亮(它似乎更快地返回它(虽然这不是一个科学观察)和“更容易”的分析。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16788553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档