If only I'd waited a few minutes. Clinton explains the difference between 
my issue and Martin's gist:

The difference is that he didn't specify the type in the URL, so it 
> searched the mappings for all types for a field called weight. Because 
> we've specified the type in the URL, it only searched myChild, notmyParent


On Monday, January 27, 2014 3:51:23 PM UTC-5, Paul Bellora wrote:
>
> 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 <bell...@gmail.com> 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 elasticsearc...@googlegroups.com.
>>> 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 elasticsearch+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/70ebd4cc-258b-458a-82f1-80b028e0e40f%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to