Function_Score query
editFunction_Score query
editA special note needs to be made about the function_score query. Due to the way PHP handles JSON encoding, everything is converted to an array of one for or another.
This is usually not a problem, since most places in the Elasticsearch API accept arrays or empty objects interchangeably.
However, the function_score is a little different and needs to differentiate between empty arrays and empty objects. For example, consider this query:
{
"query":{
"function_score":{
"functions":[
{
"random_score":{}
}
],
"boost_mode":"replace",
"query":{
"match_all":{}
}
}
}
}
The function_score defines an array of objects, and the random_score key has an empty object as it’s value. PHP’s json_encode will convert that query to this:
{
"query":{
"function_score":{
"functions":[
{
"random_score":[]
}
],
"boost_mode":"replace",
"query":{
"match_all":[]
}
}
}
}
Which will result in a parse exception from Elasticsearch. What we need to do is tell PHP that random_score contains an empty object, not an array. To do so,
we need to specify an explicitly empty object:
$params['body'] = array(
'query' => array(
'function_score' => array(
'functions' => array(
array("random_score" => (object) array())
),
'query' => array('match_all' => array())
)
)
);
$results = $client->search($params);
Now, the JSON will be encoded properly and your query will no longer generate a parser exception.