首页 > 解决方案 > 对特定的嵌套文档进行范围查询

问题描述

我有这样的文档结构。对于以下两个文档,我们有嵌套文档,称为交互信息。我只需要获取具有标题持续时间且其值大于60的文档

  {
    "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
    "interactionInfo": [
      {
        "title": "duration",
        "value": "11"
      },
      {
        "title": "timetaken",
        "value": "9"
      },
      {
        "title": "talk_time",
        "value": "145"
      }
    ]
  },
  {
    "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
    "interactionInfo": [
      {
        "title": "duration",
        "value": "120"
      },
      {
        "title": "timetaken",
        "value": "9"
      },
      {
        "title": "talk_time",
        "value": "60"
      }
    ]
  }
]

是否可以仅获取具有标题的文档:持续时间并且它们的值大于 60。嵌套文档中的值属性是文本和关键字。

标签: elasticsearchelasticsearch-dsl

解决方案


您的解决方案中几乎没有基本错误,为了利用范围查询(即查找具有超过 60 个值的文档,您需要将它们存储为您的案例中的整数)。

另请参阅具有类似示例的官方指南

让我向您展示如何执行此操作的分步示例。

索引定义

{
    "mappings" :{
        "properties" :{
            "interactionInfo" :{
                "type" : "nested"
            },
            "key" : {
                "type" : "keyword"
            }
        }
    }
}

索引示例文档

{
    "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
    "interactionInfo": [
      {
        "title": "duration",
        "value": 120. --> note, not using `""` double quotes which would store them as integer
      },
      {
        "title": "timetaken",
        "value": 9
      },
      {
        "title": "talk_time",
        "value": 60
      }
    ]
  }


{
    "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
    "interactionInfo": [
        {
            "title": "duration",
            "value": 11
        },
        {
            "title": "timetaken",
            "value": 9
        },
        {
            "title": "talk_time",
            "value": 145
        }
    ]
}

搜索查询

{
    "query": {
        "nested": {
            "path": "interactionInfo",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "interactionInfo.title": "duration"
                            }
                        },
                        {
                            "range": {
                                "interactionInfo.value": {
                                    "gt": 60
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

以及您预期的搜索结果

"hits": [
      {
        "_index": "nestedsoint",
        "_type": "_doc",
        "_id": "2",
        "_score": 2.0296195,
        "_source": {
          "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
          "interactionInfo": [
            {
              "title": "duration",
              "value": 120
            },
            {
              "title": "timetaken",
              "value": 9
            },
            {
              "title": "talk_time",
              "value": 60
            }
          ]
        }
      }
    ]

推荐阅读