1

我对 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" }
       }
    }
  }
}

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

先感谢您 !

4

1 回答 1

1

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

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

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

如果您需要有关父子文档的帮助,请随时询问!(如果你做谷歌搜索应该有例子)

祝你好运!

于 2013-07-23T21:37:50.380 回答