使用ElasticSearch无痛脚本在params数组中检查值是否存在

时间:2018-11-26 06:54:26

标签: php elasticsearch elasticsearch-painless

我是ElasticSearch的新手。我正在一个项目中,我必须搜索与输入function fromUser(model) { var preset = { 'only-letters': /[^A-Za-z]/g }; var regex = preset[attr.customInputValidator] || attr.customInputValidator; var transformedInput = model.replace(regex, ''); return transformedInput; } 相匹配的列表。我建立了一个数组,其键和值相同,并表示列表ID。我尝试运行以下示例,但在包含附近失败。该脚本是为轻松编写语言而构建的。但是,我总是会遇到运行时错误。

我无法使它正常工作,我可能做错了什么?

http://foo.bar/search?listing=123,456

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询。您可以检查script部分,了解所需的实现方式。

POST <your_index_name>/_search
{
  "query": {
    "function_score": {
      "score_mode": "sum", 
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": """
                  boolean allValues = false;
                  for(int i=0; i<params.value.size(); i++){
                    if(doc['id'].value.contains(params.value.get(i))){
                      allValues = true;
                    }else{
                      allValues = false;
                      break;
                    }
                  } 
                  if(allValues){
                    return Math.pow(3,3)
                  } else {
                    return 0;
                  }
                """,
              "params":{
                "value": ["123","456"]
              }
            }
          }
        }
      ]
    }
  }
}

查询的作用是,检查是否存在于参数中的所有值,即123 & 456是否存在于id字段中,如果存在,它将继续计算相应的分数。

在我最后测试查询时,id字段不是keyword

您可以在php脚本中相应地使用查询。让我知道是否有帮助!