【问题标题】:elastic query scipting issue using painless使用无痛的弹性查询脚本问题
【发布时间】:2021-12-02 12:44:50
【问题描述】:

当我不向其中添加某些脚本但它失败并返回时,功能脚本查询工作正常 > [script] 内的动态脚本编译过多,最大值:[75/5m];请改用索引或带参数的脚本;此限制可以通过 [script.max_compilations_rate] 设置来更改 > 当我主要向其中添加 2 个脚本时出现此错误。这也不是每次都发生,有时它工作正常,但大多数时候它返回错误。以下是查询:

工作查询:

{
  "_source": false,
  "query": {
    "function_score": {
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "doc['profile_completed_score'].value >0 ? doc['profile_completed_score'].value * 0.15 : 0"
            }
          }
        },
        {
          "script_score": {
            "script": {
              "source": "if(!doc['profile_pic'].empty)return 10; return 0;"
            }
          }
        },
        {
          "gauss": {
            "city_geolocation": {
              "origin": {
                "lat": "28.536000",
                "lon": "77.391000"
              },
              "scale": "100km",
              "offset": "100km",
              "decay": 0.0001
            }
          },
          "weight": 15
        },
        {
          "script_score": {
            "script": {
              "source": "def designation=0; if(doc['designation_name.keyword'].value != null && doc['designation_name.keyword'].value==params.designation) { designation=30; } else { if(doc['designation_name.keyword'].value != null && (doc['designation_name.keyword'].value.toUpperCase().indexOf(params.designation.toUpperCase())>-1 || params.designation.toUpperCase().indexOf(doc['designation_name.keyword'].value.toUpperCase())>-1)) designation=15; } return designation;",
              "params": {
                "designation": "Technical Manager"
              }
            }
          }
        },
        {
          "script_score": {
            "script": {
              "source": "def visited=0;def vscore=0;if(!doc['visited_event'].empty && doc['visited_event'].values.contains(params.fact))visited=10;if(!doc['avg_visitor_score'].empty)vscore=doc['avg_visitor_score'].value*0.2; return visited+vscore;",
              "params": {
                "fact": "13039"
              }
            }
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "replace"
    }
  },
  "size": 20,
  "from": 0
}

大多数时候查询返回错误:

{
  "_source": false,
  "query": {
    "function_score": {
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "doc['profile_completed_score'].value >0 ? doc['profile_completed_score'].value * 0.15 : 0"
            }
          }
        },
        {
          "script_score": {
            "script": {
              "source": "if(!doc['profile_pic'].empty)return 10; return 0;"
            }
          }
        },
        {
          "gauss": {
            "city_geolocation": {
              "origin": {
                "lat": "28.536000",
                "lon": "77.391000"
              },
              "scale": "100km",
              "offset": "100km",
              "decay": 0.0001
            }
          },
          "weight": 15
        },
        {
          "script_score": {
            "script": {
              "source": "def designation=0; if(doc['designation_name.keyword'].value != null && doc['designation_name.keyword'].value==params.designation) { designation=30; } else { if(doc['designation_name.keyword'].value != null && (doc['designation_name.keyword'].value.toUpperCase().indexOf(params.designation.toUpperCase())>-1 || params.designation.toUpperCase().indexOf(doc['designation_name.keyword'].value.toUpperCase())>-1)) designation=15; } return designation;",
              "params": {
                "designation": "Technical Manager"
              }
            }
          }
        },
        {
          "script_score": {
           "script": {
              "source": "if(!doc['email_active'].empty && doc['email_active'].toInstant().toEpochMilli()/(params.divi) >= (params.epochtime)) return 30; return 0;",
              "params": {
                "divi": 1000,
                "epochtime": 1607863137
              }
            }
          }
        },
        {
          "script_score": {
            "script": {
              "source": "if((!doc['checkin_edition'].empty && doc['checkin_edition'].contains(params.fact))) return 30; return 0;",
              "params": {
                "fact": "1330689"
              }
            }
          }
        },
        {
          "script_score": {
            "script": {
              "source": "def visited=0;def vscore=0;if(!doc['visited_event'].empty && doc['visited_event'].values.contains(params.fact))visited=10;if(!doc['avg_visitor_score'].empty)vscore=doc['avg_visitor_score'].value*0.2; return visited+vscore;",
              "params": {
                "fact": "13039"
              }
            }
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "replace"
    }
  },
  "size": 20,
  "from": 0
}

非常感谢任何形式的帮助。

[在此处输入图片描述][1]

谢谢//

[1]:https://i.stack.imgur.com/8LMRj.png**strong文字**

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: elasticsearch kibana elasticsearch-painless esquery


【解决方案1】:

[script] 内部动态脚本编译过多,最大值:[75/5m];请改用索引或带参数的脚本;这个限制可以通过 [script.max_compilations_rate] 设置来改变

问题源于您的script_score 查询中的逐字脚本。如果您阅读了您遇到的错误,重要的部分是请使用索引或带参数的脚本

所以你应该做的是store scripts,所以它们只编译一次。

POST _scripts/my-script
{
   "script": {
      "lang": "painless",
      "source": "doc['profile_completed_score'].value >0 ? doc['profile_completed_score'].value * 0.15 : 0"
   }
}

然后您可以在查询中通过 id 引用它们

  "functions": [
    {
      "script_score": {
        "script": {
          "id": "my-script"
        }
      }
    },

【讨论】:

  • 谢谢 Val,我尝试了你的建议。存储所有脚本并在我的查询中使用 id 使用它们。仍然给出相同的错误//您可以建议任何其他选项吗?
  • 您需要存储所有脚本,否则您将不断收到此错误
猜你喜欢
  • 2022-06-19
  • 2017-09-29
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多