首页 > 解决方案 > Elasticsearch - 对象类型,搜索嵌套元素

问题描述

我正在使用 Elasticsearch 7.2.0 版,并且在我的映射中有以下类型:

"status_change": {
  "type": "object",
  "enabled": false
},

该字段内的数据示例:

"before": {
  "status_type": "Status One"
},
"after": {
  "status_type": "Status Two"
}

有各种状态类型,我正在尝试创建一个查询来识别从状态类型之前指定到状态类型之后指定的更改。我正在努力通过这些嵌套元素进行查询,并且以下查询失败:

{
  "query": {
    "bool": {
       "must": {
          "match_all": {}
       },
       "filter": {
         "nested": {
           "path": "status_change",
           "query": {
              "term": {
                 "status_change.before": "the_before_status"
              }
           }
         }
       }
     }
   }
 }

和:

"caused_by" : {
  "type" : "illegal_state_exception",
  "reason" : "[nested] nested object under path [status_change] is not of nested type"
}

这是不言自明的,因为 status_change 不是“嵌套”字段。我曾尝试通过嵌套元素来搜索对象,但我还没有找到解决方案。

有没有办法让我像这样搜索嵌套的对象元素?

标签: elasticsearch

解决方案


您没有使用nested类型,而是使用object类型。有区别,我建议您浏览上述链接。

如果您使用的是嵌套类型

将您的映射更改为以下内容:

"status_change": {
  "type": "nested"
}

一旦你这样做,然后重新索引文档,你拥有的查询将简单地返回包含文档列表,status_change.before: the_before_status无论你status_change.after在文档中拥有什么值。

要基于 进行进一步过滤,请在该字段中status_change.after添加另一个must子句以返回您正在查找的文档。

如果您使用对象类型

只需enabled: false从映射中删除该字段并将查询更改为以下内容:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "status_change.before.status_type": "the_before_status"
          }
        }
      ]
    }
  }
}

希望有帮助!


推荐阅读