Just to close the loop on this topic, Clinton Gormley posted an answer to 
the SO question with a workaround: use doc['*myParent.*weight'].value. He 
also opened an 
issue<https://github.com/elasticsearch/elasticsearch/issues/4914>for this 
behavior.

Although as I commented on the SO answer, Martin Groningen's 
gist<https://gist.github.com/martijnvg/8639841>does work fine and I'm not sure 
what the difference is between the two 
cases.

Thank you Martin and Clinton for your help.

On Sunday, January 26, 2014 4:47:48 PM UTC-5, Martijn v Groningen wrote:
>
> Hi Paul,
>
> The mapping and query that you're sharing make sense and should work. I 
> verified that with a small recreation:
> https://gist.github.com/martijnvg/8639841
>
> What I think you're running into is that a document of type 'myParent' 
> doesn't have the field `weight`. Can you check if that is the case?
> If so you might want to add a `null_value` for the weight field, so that 
> all `myParent` docs have a value for the weight field.
>
> Martijn
>
>
> On 24 January 2014 21:38, Paul Bellora <[email protected] <javascript:>>wrote:
>
>> Update: posted to Stack Overflow with bounty: 
>> http://stackoverflow.com/questions/21289149/trouble-with-has-parent-query-containing-scripted-function-score
>>
>>
>> On Thursday, January 16, 2014 11:11:27 AM UTC-5, Paul Bellora wrote:
>>>
>>> I have two document types, in a parent-child relationship:
>>>
>>> "myParent" : {
>>>   "properties" : {
>>>     "weight" : {
>>>       "type" : "double"
>>>     }
>>>   }
>>> }
>>>
>>>
>>> "myChild" : {
>>>   "_parent" : {
>>>     "type" : "myParent"
>>>   },
>>>   "_routing" : {
>>>     "required" : true
>>>   }
>>> }
>>>
>>>
>>> The weight field is to be used for custom scoring/sorting. This query 
>>> directly against the parent documents works as intended:
>>>
>>> {
>>>   "query" : {
>>>     "function_score" : {
>>>       "script_score" : {
>>>         "script" : "_score * doc['weight'].value"
>>>       }                 
>>>     }                                                                   
>>>     
>>>   }    
>>> }
>>>
>>>
>>> However, when trying to do similar scoring for the child documents with 
>>> a has_parent query, I get an error:
>>>
>>> {
>>>   "query" : {
>>>     "has_parent" : {
>>>       "query" : {
>>>         "function_score" : {                                           
>>>          
>>>           "script_score" : {
>>>             "script" : "_score * doc['weight'].value"
>>>           }
>>>         }
>>>       },
>>>       "parent_type" : "myParent",
>>>       "score_type" : "score"
>>>     }
>>>   }
>>> }
>>>
>>>
>>> The error is:
>>>
>>> QueryPhaseExecutionException[[myIndex][3]: 
>>> query[filtered(ParentQuery[myParent](filtered(function 
>>> score (ConstantScore(*:*),function=script[_score * 
>>> doc['weight'].value], params [null]))->cache(_type:
>>> myParent)))->cache(_type:myChild)],from[0],size[10]: Query Failed 
>>> [failed to execute context rewrite]]; nested: 
>>> ElasticSearchIllegalArgumentException[No 
>>> field found for [weight] in mapping with types [myChild]];
>>>
>>> It seems like instead of taking the result of the scoring function and 
>>> applying it to the child, ES is taking the scoring *function* and 
>>> applying it to the child, hence the error.
>>>
>>> If I don't use score for score_type, the error doesn't occur, although 
>>> the results scores are then all 1.0, as documented.
>>>
>>> What am I missing here? How can I query these child documents with 
>>> custom scoring based on a parent field?
>>>
>>  -- 
>> 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 [email protected] <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elasticsearch/a3ec1600-157e-45e9-b006-37cddc2b422f%40googlegroups.com
>> .
>>
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>
>
> -- 
> Met vriendelijke groet,
>
> Martijn van Groningen 
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/662aaafb-79fa-4438-857d-43a46aef7c5a%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to