ElasticSearch:搜索并返回嵌套类型

时间:2013-07-23 18:30:57

标签: 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" }
       }
    }
  }
}

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

提前谢谢!

1 个答案:

答案 0 :(得分:1)

可悲的是,你不能只回到文件的一部分。如果文档与查询匹配,您将获得整个事情;根和所有嵌套文档。如果您只想获得部件,那么您可以查看使用父/子文档。

由于嵌套查询中的语法错误很少,因此您没有看到任何匹配。仔细查看字段名称:

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

如果您需要有关父母的帮助文档,请随时提出! (如果您进行谷歌搜索,应该有例子)

祝你好运!