ElasticSearch:搜索并返回嵌套类型



我是ElasticSearch的新手,在使用嵌套映射/查询时遇到了问题。

我在索引中添加了以下数据结构:

{
   "_id": "3",
   "_rev": "6-e9e1bc15b39e333bb4186de05ec1b167",
   "skuCode": "test",
   "name": "Dragon vol. 1",
   "pages": [
       {
           "id": "1", 
           "tags": [
               {
                   "name": "dragon"
               },
               {
                   "name": "japonese"
               }
           ]
       },
       {
           "id": "2",               
           "tags": [
               {
                   "name": "tagforanotherpage"
               }
           ]
       }
   ]
}

该索引映射定义如下:

{
  "metabook" : {
    "metabook" : {
      "properties" : {
        "_rev" : {
          "type" : "string"
        },
        "name" : {
          "type" : "string"
        },
        "pages" : {
          "type" : "nested",
          "properties" : {
            "tags" : {
              "properties" : {
                "name" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "skuCode" : {
          "type" : "string"
        }
      }
    }
  }
}

我的目标是搜索包含特定标签的所有页面,并返回带有过滤页面列表的图书对象(我希望ES只返回与给定标签匹配的页面)。类似(忽略第二页):

{
   "_id": "3",
   "_rev": "6-e9e1bc15b39e333bb4186de05ec1b167",
   "skuCode": "test",
   "name": "Dragon vol. 1",
   "pages": [
       {
           "id": "1",               
           "tags": [
               {
                   "name": "dragon"
               },
               {
                   "name": "japonese"
               }
           ]
       }
   ]
}

以下是我实际使用的查询:

{
"from": 0,
"size": 10,
"query" : {
    "nested" : {
        "path" : "pages",
        "score_mode" : "avg",
        "query" : {
           "term" : { "tags.name" : "japonese" }
       }
    }
  }
}

但它实际上返回了一个空结果。我做错了什么?也许我应该直接索引我的"页面"而不是书籍?我错过了什么?

提前谢谢!

遗憾的是,您不能只返回文档的一部分。如果文档与查询匹配,您将取回整个文档;根和所有嵌套的文档。如果你只想取回部分,那么你可以考虑使用父/子文档。

此外,由于嵌套查询中有一个小语法错误,因此您没有看到任何命中。仔细查看字段名称:

{
"from": 0,
"size": 10,
"query" : {
    "nested" : {
        "path" : "pages",
        "score_mode" : "avg",
        "query" : {
           "term" : { "pages.tags.name" : "japonese" }
       }
    }
  }
}

如果您需要亲子文档方面的帮助,请随时询问!(如果你在谷歌上搜索,应该有一些例子)

祝你好运!

最新更新