【问题标题】:ElasticSearch 6.7 painless, how to access nested documentElasticSearch 6.7 无痛,如何访问嵌套文档
【发布时间】:2019-11-05 02:45:55
【问题描述】:

当我使用 ES 5.5 更新到 6.7。 无痛脚本不起作用

这是 5.5 如果我想要一个嵌套文档 [transFilter] 我这样做

params['_source’]['carFilter’]

效果很好。

但是

当我使用 6.7 版本时

参数['_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"

【问题讨论】:

    标签: elasticsearch elasticsearch-painless


    【解决方案1】:

    查看您的查询,您可能希望过滤具有carFilter.time &gt; 1 的文档,为什么不使用简单的Nested Query

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

    请注意,我已使用 Range Query 根据您要查找的内容来评估时间。

    如果上述方法没有帮助,我建议您通过 this answer

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

    【讨论】:

    • 真的非常感谢您的回答。这个脚本只是故意简化来说明问题。请告诉我如何使用无痛访问嵌套文档。谢谢
    • @brooks 很抱歉延迟回复。我想这在 ES 版本 6 之后是不可能的。我分享了另一个答案链接,它可以帮助你,但我认为你所拥有的已经不可能了。
    • 再次感谢您的回答..我已经尝试阅读官方文档,但我没有发现访问嵌套文档的任何用法。那么你知道该怎么做吗,或者我应该去哪里找到答案?
    • @brooks 我认为不可能在 ES 6.x 版本之后做类似的事情。您可能必须采用我在答案中提到的链接中提到的两种解决方案中的任何一种。
    猜你喜欢
    • 2018-09-19
    • 2022-07-06
    • 2015-05-30
    • 2019-11-30
    • 2021-11-09
    • 2013-06-12
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多