【问题标题】:Doing a Range Query over particular Nested Document对特定的嵌套文档进行范围查询
【发布时间】:2020-04-30 14:53:39
【问题描述】:

我有一个这样的文档结构。对于以下两个文档,我们有嵌套文档,称为交互信息。我只需要获取标题为 duration 且其值大于 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"
      }
    ]
  }
]

是否可以只获取title:duration且值大于60的文档。嵌套Document中的Value属性为文本和关键字。

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl


    【解决方案1】:

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

    另请参考this官方指南,里面有类似的例子。

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

    索引定义

    {
        "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
                }
              ]
            }
          }
        ]
    

    【讨论】:

    • 感谢您的回复,我已经知道愤怒查询不支持文本字段。但是我们已经将很多文档存储为 String 的值,而不是 Integer。是否有任何可能的方法来对文本字段进行范围查询,例如应用脚本或无痛查询。
    • @Thilak 现在我知道了原因?。无论如何,如果您看到,您没有明确提及,因为社区不会知道,对吗?现在这是这个问题的扩展,但我建议提出一个后续问题,因为有时用户没有定义自己的映射,这会导致存储数字字符串和这个问题,并考虑我回答的那个问题,这仍然对社区。您能否投票并接受此答案,以便社区知道此答案解决所提出的问题,然后将您的后续问题链接评论给我,希望回答:)
    • 嗨,opster 再次感谢您抽出宝贵时间回复。但我已经在问题的底部提到过,因为值字段是文本和关键字。是的,我没有正确提及它是我的错误。
    • @Thilak,对不起,我刚醒来,如果您看到最初未提及的原始问题,请单击问题中的编辑历史记录来检查。你是社区的新手,错过一些东西是可以的,但你也应该明白社区正在帮助你,我已经投入了相当多的时间让它发挥作用,正如我之前的评论中所解释的那样,它仍然非常有用回答因此不想修改答案,如果您有新要求,它是提出另一个后续问题的标准,并且非常乐意进一步帮助您?
    • 好的opster会跟进
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多