【问题标题】:ElasticSearch : search and return nested typeElasticSearch:搜索并返回嵌套类型
【发布时间】:2016-10-07 21:03:16
【问题描述】:

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

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

提前谢谢你!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

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

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

    祝你好运!

    【讨论】:

    • 我认为他们正在筹备中,可以满足您的要求,但尚未发布...
    • 它对我不起作用我使用以下查询:{ "from": 0, "size": 10, "query": { "nested": { "path": "language", "score_mode": "avg", "query": { "term": { "language.langName": "English" } } } } }
    • 您正在寻找的功能是inner_hits,这似乎是在 1.5 版中添加的,请参阅此答案:stackoverflow.com/questions/16788553/…
    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多