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

弹性查询提示问题使用无痛

骆文华
2023-03-14

当我不向其添加某些脚本但它失败并返回时,函数脚本查询工作正常

工作查询:

{
  "_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文本**

共有1个答案

潘嘉颖
2023-03-14

[script]内的动态脚本编译太多,最大:[75/5m];请改用带参数的索引脚本或脚本。此限制可通过[script.max_compilations_rate]设置进行更改

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

因此,您应该做的是存储脚本,以便它们只编译一次。

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"
        }
      }
    },
 类似资料:
  • 我一直在使用带有hibernate的JPA 2.0作为我的网络应用程序的供应商。对于其中一个数据库查询,我使用JPA标准生成器API来构造动态查询。我已经能够让它像预期的那样工作了。 查询在两个表A之间有一个读取连接 我还使用setMaxResults来限制返回给用户的记录数 仅供参考,数据库中大约有400条记录。 当我在日志中看到查询结果时,我看到它加载了内存中的所有400条记录。但是,由于设置

  • 我试图使用solrj构建一个solr查询。根据我对Solr-7.5.0的理解,solrj的所有库和依赖项都应该包含在我的Solr安装中。下面是我的/dist文件夹,后面是我的/dist/solrj-lib文件夹 现在,我的查询将被绑定到一个html post表单,但我想让solrj先工作。这是我全部的solrj 这将无法编译,因为它无法识别我的类(SolrClient、SolrQuery等)。我肯

  • 问题内容: 每次执行此查询需要200毫秒以上的时间: 但这每次在第一次查询后每次执行只需要2-3毫秒: 注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?从第一个查询中删除不会更改任何内容。 当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果

  • 我有字段类别 我的要求是针对下面提到的3个类别,我需要通过编写弹性搜索查询来标记问题(因此我希望查询中的类别和问题字段) 类别: OLA BNA公司 DRG公司 获取logstash-sdc-反馈/_search?{"_source":["Category.keyword"],"大小":5,"查询":{"bool":{"必须": [ {"匹配":{"Category.keyword":"OLA",

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我在使用Python弹性搜索访问数据时遇到了一个问题。我正在得到 尝试使用时出错 我的弹性搜索版本6.5。4,python版本3.7。2.