Function_score and elasticsearch-php


(Erdal Gunyar) #1

Hi everybody,

Does anyone here successfully implemented function_score with
elasticsearch-php?
Of course, without passing all the body as a JSON string.

I've actually tried but it failed, it looks like it's impossible to pass
the "array+object" located in the "functions" part :
"query": {
"function_score": {
"query": {
"query_string": {
"query": "MyQuery",
}
},
"functions": [{
"script_score": {
"script": "doc['boostfield'].value"
}
}],
"score_mode": "multiply"
}
},

Any help will be appreciated! :slight_smile:

Thanks,

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/f51a1488-ce22-4119-94ed-57ba13a5cdf2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(Zachary Tong) #2

Hey there. It's possible, but it requires explicit object creation via the
PHP \stdClass() object. PHP isn't very good at deciding between arrays and
objects when using json_encode, unless you use explicit objects.

Untested, but try this:

$scriptScore = new \stdClass();$scriptScore->script = "doc['boostfield'].value";
$qry = array(
'query' => array(
'function_score' => array(
'functions' => array(
array("script_score" => $scriptScore)
),
'query' => array(
'query_string' => array('query' => 'MyQuery')
),
'score_mode' => 'multiply'
)
));
$searchParams['body'] = $qry;
$client = new Elasticsearch\Client();$retDoc = $client->search($searchParams);print_r($retDoc);

This particular PHP irritation just came up the other day as a ticket
(https://github.com/elasticsearch/elasticsearch-php/issues/47), so you're
not alone in being confused. I'm going to write some documentation about
how to accomplish it, since the syntax is different from normal DSL queries.

-Zach

On Wednesday, March 12, 2014 2:47:00 PM UTC-4, Erdal Gunyar wrote:

Hi everybody,

Does anyone here successfully implemented function_score with
elasticsearch-php?
Of course, without passing all the body as a JSON string.

I've actually tried but it failed, it looks like it's impossible to pass
the "array+object" located in the "functions" part :
"query": {
"function_score": {
"query": {
"query_string": {
"query": "MyQuery",
}
},
"functions": [{
"script_score": {
"script": "doc['boostfield'].value"
}
}],
"score_mode": "multiply"
}
},

Any help will be appreciated! :slight_smile:

Thanks,

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/479748b5-55b4-4c2d-a370-4d8740118b5b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(Zachary Tong) #3

For the record, this array syntax should work as well:

$qry = array(
'query' => array(
'function_score' => array(
'functions' => array(
array("script_score" => array('script' => "doc['boostfield'].value"))
),
'query' => array(
'query_string' => array('query' => 'MyQuery')
),
'score_mode' => 'multiply'
)
));

But the object notation tends to be safer because it can handle empty
objects (for example, a random function without a seed is just
"random_score" : {}, which will break the array notation. Objects make
sure that doesn't happen.

On Wednesday, March 12, 2014 2:47:00 PM UTC-4, Erdal Gunyar wrote:

Hi everybody,

Does anyone here successfully implemented function_score with
elasticsearch-php?
Of course, without passing all the body as a JSON string.

I've actually tried but it failed, it looks like it's impossible to pass
the "array+object" located in the "functions" part :
"query": {
"function_score": {
"query": {
"query_string": {
"query": "MyQuery",
}
},
"functions": [{
"script_score": {
"script": "doc['boostfield'].value"
}
}],
"score_mode": "multiply"
}
},

Any help will be appreciated! :slight_smile:

Thanks,

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/4af5db19-af3d-4a01-b428-6b8e3e90af75%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(Erdal Gunyar) #4

Hello Zachary,

Thank you for your quick and working responses!
I've previously tried with double array method and didn't worked, I should
have missed something at that time.

And thanks also for the object method, didn't know :slight_smile:

Have a good day all,

Erdal.

Le mercredi 12 mars 2014 20:05:11 UTC+1, Zachary Tong a écrit :

For the record, this array syntax should work as well:

$qry = array(
'query' => array(
'function_score' => array(
'functions' => array(
array("script_score" => array('script' => "doc['boostfield'].value"))
),
'query' => array(
'query_string' => array('query' => 'MyQuery')
),
'score_mode' => 'multiply'
)
));

But the object notation tends to be safer because it can handle empty
objects (for example, a random function without a seed is just
"random_score" : {}, which will break the array notation. Objects make
sure that doesn't happen.

On Wednesday, March 12, 2014 2:47:00 PM UTC-4, Erdal Gunyar wrote:

Hi everybody,

Does anyone here successfully implemented function_score with
elasticsearch-php?
Of course, without passing all the body as a JSON string.

I've actually tried but it failed, it looks like it's impossible to pass
the "array+object" located in the "functions" part :
"query": {
"function_score": {
"query": {
"query_string": {
"query": "MyQuery",
}
},
"functions": [{
"script_score": {
"script": "doc['boostfield'].value"
}
}],
"score_mode": "multiply"
}
},

Any help will be appreciated! :slight_smile:

Thanks,

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/7c556d4b-88b7-4a0b-bf73-3c4442ab707b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(Zachary Tong) #5

No problem, glad to help! The syntax is definitely kinda gross, I'll try
to write some docs on it soon to help others.

Let me know if you run into any more problems, and feel free to open a
ticket at the Elasticsearch-PHP github repo, I keep a closer eye on tickets
than the mailing list :slight_smile:

-Z

On Thursday, March 13, 2014 9:37:42 AM UTC-4, Erdal Gunyar wrote:

Hello Zachary,

Thank you for your quick and working responses!
I've previously tried with double array method and didn't worked, I should
have missed something at that time.

And thanks also for the object method, didn't know :slight_smile:

Have a good day all,

Erdal.

Le mercredi 12 mars 2014 20:05:11 UTC+1, Zachary Tong a écrit :

For the record, this array syntax should work as well:

$qry = array(
'query' => array(
'function_score' => array(
'functions' => array(
array("script_score" => array('script' => "doc['boostfield'].value"))
),
'query' => array(
'query_string' => array('query' => 'MyQuery')
),
'score_mode' => 'multiply'
)
));

But the object notation tends to be safer because it can handle empty
objects (for example, a random function without a seed is just
"random_score" : {}, which will break the array notation. Objects make
sure that doesn't happen.

On Wednesday, March 12, 2014 2:47:00 PM UTC-4, Erdal Gunyar wrote:

Hi everybody,

Does anyone here successfully implemented function_score with
elasticsearch-php?
Of course, without passing all the body as a JSON string.

I've actually tried but it failed, it looks like it's impossible to pass
the "array+object" located in the "functions" part :
"query": {
"function_score": {
"query": {
"query_string": {
"query": "MyQuery",
}
},
"functions": [{
"script_score": {
"script": "doc['boostfield'].value"
}
}],
"score_mode": "multiply"
}
},

Any help will be appreciated! :slight_smile:

Thanks,

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/6d868de2-1c3e-4f4b-abfa-d8fc45e8cd67%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(system) #6