May Elasticsearch嵌套查询只返回嵌套字段的匹配嵌套文档吗?

zak*_*ako 5 elasticsearch

我是Elasticsearch的新手,并提出一个问题,即Elasticsearch嵌套查询是否只返回嵌套字段的匹配嵌套文档.

例如,我有一个名为blog嵌套字段的类型comments

{
  "id": 1,
  ...
  "comments":[
    {"content":"Michael is a basketball player"},
    {"content":"David is a soccer player"}
  ]
}
{
  "id": 2,
  ...
  "comments":[
    {"content":"Wayne is a soccer player"},
    {"content":"Steven is also a soccer player"},
  ]
}
Run Code Online (Sandbox Code Playgroud)

和嵌套查询

{"query":{
  "nested":{
    "path":"comments",
    "query":{"match":{"comments.content":"soccer"}}
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是搜索带有提及"足球"的评论的博客帖子,其中每个博客文章的评论数量与"足球"相匹配(在示例中它的数量为1,因为另一条评论刚刚提到"篮球").

{"hits":[
  {
    "id":1,
    ...
    "count_for_comments_that_matches_query":1,
  },
  {
    "id":2,
    ...
    "count_for_comments_that_matches_query":2,
  }
]}
Run Code Online (Sandbox Code Playgroud)

然而,似乎Elasticsearch总是返回完整的文档,所以我怎么能实现它,或者我不能?

Sar*_*mad 1

答案就在这里。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html#nested-inner-hits

您需要使用nested inner hitsElasticsearch的功能。

{
   "_source": [
      "id"
   ],
   "query": {
      "bool": {
         "must": [
            {
               "match": {
                  "id": "1"
               }
            },
            {
               "nested": {
                  "path": "comments",
                  "query": {
                     "match": {
                        "comments.content": "soccer"
                     }
                  },
                  "inner_hits": {}
               }
            }
         ]
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为这会解决问题