Elasticsearch:路径下的嵌套对象不是嵌套类型

Dan*_*kle 25 nested elasticsearch

我一直在尝试搜索包含嵌套字段的文档.我创建了这样的嵌套映射:

{
  "message": {
    "properties": {
      "messages": {
        "type": "nested",
        "properties": {
          "message_id": { "type": "string" },
          "message_text": { "type": "string" },
          "message_nick": { "type": "string" }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的搜索看起来像这样:

curl -XGET 'localhost:9200/thread_and_messages/thread/_search' \
     -d '{"query": {"bool": {"must": [{"match": {"thread_name": "Banana"}}, {"nested": {"path": "messages", "query": {"bool": {"must": [{"match": {"messages.message_text": "Banana"}}]}}}]}}}}'
Run Code Online (Sandbox Code Playgroud)

然而,我收到此错误消息:

QueryParsingException[[thread_and_messages] [nested] nested object under path [messages] is not of nested type]
Run Code Online (Sandbox Code Playgroud)

编辑

我仍然收到此错误.我通过Java这样做,所以这是我想要创建的文档:

{
  "_id": {
    "path": "3",
    "thread_id": "3",
    "thread_name": "Banana",
    "created": "Wed Mar 25 2015",
    "first_nick": "AdminTech",
    "messages": [
      {
        "message_id": "9",
        "message_text": "Banana",
        "message_nick": "AdminTech"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样创建索引:

CreateIndexRequestBuilder indexRequest = client.admin().indices().prepareCreate(INDEX).addMapping("message", mapping);
Run Code Online (Sandbox Code Playgroud)

我想我可能错误地索引了文档.

Bab*_*yan 24

TLDR:放入"type": "nested",您的嵌套类型.

假设我们有一个普通类型,另一个类型嵌套在其中:

{
   "some_index": {
      "mappings": {
         "normal_type": {
            "properties": {
               "nested_type": {
                  "type": "nested",
                  "properties": {
                     "address": {
                        "type": "string"
                     },
                     "country": {
                        "type": "string"
                     }
                  }
               },
               "first_name": {
                  "type": "string"
               },
               "last_name": {
                  "type": "string"
               }
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

"type": "nested",嵌套查询需要该行才能"path":分配到nested_type,如下所示:

GET /some_index/normal_type/_search
{
  "query": {
    "nested": {
      "query": {
        "bool": {}
      },
      "path": "nested_type"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

"type": "nested",条线似乎只在较新的Elasticsearch版本中需要(从1.1.1开始?).

  • 但OP已经有“类型”:“嵌套”。是不是放错地方了?我有同样的问题 (3认同)