当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch 6.7无痛,如何访问嵌套文档

齐招
2023-03-14

我用ES 5.5的时候更新到6.7。无痛脚本不起作用

这是5.5如果我想获取嵌套文档[transFilter]我这样做

params['_source’]['carFilter’]

效果很好。

但是

当我使用6.7版本时

params['_source']['carFilter']

我发现它不起作用

所有参数['_source']为空

我的映射

carFilter": {
          "type": "nested",
          "properties": {
            "time": {
              "type": "long"
            }
          }
        }

我的数据示例

"carFilter" : [
            {
              "time" : 20200120
            },
            {
              "time" : 20200121
            }
          ]

和我的查询脚本示例

{
  "query" : {
    "bool" : {
      "must" : [
        {
          "script" : {
            "script" : {
               "inline" : "if(params['_source']!=null){
                             if(params['_source']['carFilter']!=null){   
                                 for(def item:params['_source']['carFilter'] ){
                                    if (item.time>1) {   return true; }
                                 }
                              }
                            }
                             return false;",
              "lang" : "painless",
              "params" : {
                "rentTime" : 1000
              }
            }
          }
        }      
      ] 
    }
  }
}

甚至没有错误只有事实

if(params['_source']!=null){

这一行已经返回

上面的简单无痛只是为了说明问题,下面附上了一个相对真实的问题。

double carPrice=0.00;if(!params['_source'].empty){"+
                " def days=params['_source']['everyDayPrice'];if(params['_source']['everyDayPrice']!=null){int size=days.length;" +
                " if(size>0){for(int i=0;i<size;i++){String day = days[i]['day'];Double price = days[i]['price'];"+
                " if(price!=null&&params.get(day)!=null){carPrice=carPrice+params.get(day)*price;}}}}}" +
                " return carPrice/params.total"

共有1个答案

皇甫才良
2023-03-14

查看您的查询,您可能希望筛选具有 carFilter.time 的文档

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "carFilter",
            "query": {
              "range": {
                "carFilter.time": {
                  "gte": 1
                }
              }
            }
          }
        }
      ]
    }
  }
}

请注意,我使用了范围查询来根据您要查找的内容计算时间。

如果上面的回答没有帮助,我建议你仔细阅读这个答案。

如果您有任何疑问,请告诉我。

 类似资料:
  • 我想从特定字段中搜索关键字并返回文档。在这些文档之上,我希望遍历每个嵌套对象,并从选定文档的同一特定字段中再次搜索关键字。 如果关键字存在,则检查:如果布尔isCurrent = True,则设置isCurrent=0,并将该值追加到列表中;否则,如果isCurrent = False,则取当前日期时间的差值,结束日期时间,并获得以月为单位的值,并将该值追加到列表中。 最后,从每个文档的列表中获取

  • 问题内容: 假设我有json数据,例如 现在我正在从该json数据访问字段,例如: 如何以最有效的方式从给定的json数据访问第三个字段()? 不起作用 一种可能是我使用for循环构造字符串,然后进行eval评估,但是有没有有效的方法呢? 问题答案: 老实说,我无法理解您的问题。JSON已经结构化了,为什么需要更改结构? 在您的情况下,我将按以下方式访问它: 如果碰巧希望 遍历 数据,则需要: 更

  • {“_index”:“pie”,“_type”:“flare”,“_id”:“2”,“_version”:1,“_score”:1,“_source”:{“id”:2,“父级”:1,“data”:{“memory”:50}}}

  • 问题内容: 我有一个Java的HashMap,其内容(大家可能都知道)可以由 如果在另一个HashMap中有一个HashMap,即嵌套的HashMap,我将如何访问内容?我可以这样做吗,内联: 谢谢。 问题答案: 您可以像假设的那样进行操作。但是您的HashMap必须模板化: 否则,从第一张地图检索第二张地图后,您必须进行强制转换。

  • 此类的目的是模拟二进制搜索树的功能。在下面的代码中,我试图将它从一个结构和一堆函数改编成一个包装类,称为BST。但是,我不确定的一件事是如何从节点结构中访问“根”。Root当前在BST类中声明。 具体来说,在show函数中。它不像把它和其他函数放在节点中那样简单,因为根需要是唯一的,并且新节点至少被调用一次。Show将不会在当前状态下编译,我不确定从这里开始。

  • 问题内容: 我希望这段代码可以说明问题: 我知道我可能做错了什么,因为继承可能不应该以这种方式使用。但这是我遇到的最简单的方法。而且,除此之外,我很好奇。可能吗? 问题答案: 似乎起作用。 根据JLS第15.12节 班级名称 。超级。NonWildTypeArguments_opt标识符(ArgumentList_opt) 是有效的MethodInvocation