Check value exists in params array using ElasticSearch painless script
Asked Answered
B

1

1

I am new to ElasticSearch. I am working on a project where I have to search listings which matches the input http://foo.bar/search?listing=123,456. I have built an array which key and value are the same and representing the listing ids. I have tried to run the following example but it failed near contains. The script is built for painless language. However, I always get the runtime error.

I cannot get this to work, what could I be doing wrong?

 'function_score' => [
       'query' => $query,
           'score_mode' => 'sum',
              'functions' => [[
                'script_score' => [
                 'script' => [
                   'params' => ['listing' => [123 => 123, 456 => 456]],
    'source' => "(params.listing.contains(doc['id'].value) ? Math.pow(3, 3) : 0)",
                            ],
                        ],
                    ]],
                ],
Beerbohm answered 26/11, 2018 at 6:54 Comment(0)
F
1

You can make use of the below query. You can check the script part as how what you need has been implemented.

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"]
              }
            }
          }
        }
      ]
    }
  }
}

What the query does is, it checks to see if all the values present in params i.e 123 & 456 is present in the id field, if it does, it would go ahead and calculate score accordingly.

Not that id field is a keyword when I tested the query at my end.

You can use the query accordingly in your php script. Let me know if this helps!

Freely answered 26/11, 2018 at 7:11 Comment(3)
Didn't work, gives me compile error. Whats inside contain in my case is a collection and not an object.Beerbohm
@Beerbohm I know about that and looking at your script using a collection doesn't make sense if all you want is to verify if url contains a set of values. Wouldn't array be better off with it? And also did you try to run the above query from Kibana or Postman? I want to make sure that the above query runs in your machine using one of rest client tools. Also you can change from source to inline and give it a try if you end up with any compilation error mentioning about sourceFreely
it did not work, is there a way to stick with what I put using sourceBeerbohm

© 2022 - 2025 — McMap. All rights reserved.