Trouble with has_parent query containing scripted function_score

后端 未结 2 1546
时光取名叫无心
时光取名叫无心 2020-12-19 19:17

I have two document types, in a parent-child relationship:

\"myParent\" : {
  \"properties\" : {
    \"weight\" : {
      \"type\" : \"double\"
    }
  }
}

         


        
相关标签:
2条回答
  • 2020-12-19 19:59

    This I would say is a bug: it is using the myChild mapping as the default context, even though you are inside a has_parent query. But I'm not sure how easy the bug would be to fix. properly.

    However, you can work around it by including the type name in the full field name:

    curl -XGET "http://localhost:9200/t/myChild/_search" -d'
    {
      "query": {
        "has_parent": {
          "query": {
            "function_score": {
              "script_score": {
                "script": "_score * doc[\"myParent.weight\"].value"
              }
            }
          },
          "parent_type": "myParent",
          "score_type": "score"
        }
      }
    }'
    

    I've opened an issue to see if we can get this fixed #4914

    0 讨论(0)
  • 2020-12-19 20:02

    I think the problem is that you are trying to score child documents based on a field in the parent document and that the function score should really be the other way round.

    To solve the problem my idea would be to store the parent/child relation and the score with the child documents. Then you would filter for child documents and score them according to the weight in the child document.

    An example:

    "myParent" : {
        "properties" : {
            "name" : {
                "type" : "string"
            }
        }
    }
    
    "myChild" : {
        "_parent" : {
            "type" : "myParent"
        },
        "_routing" : {
            "required" : true
        },
        "properties": {
            "weight" : {
                "type" : "double"
            }
        }
    }
    

    Now you could use a has_parent filter to select all child documents that have a certain parent and then score them using the function score:

    {
        "query": {
            "filtered": {
                "query": {
                    "function_score" : {
                        "script_score" : {
                            "script" : "_score * doc['weight'].value"
                        }
                    }
                },
                "filter": {
                    "has_parent": {
                        "parent_type": "myParent",
                        "query": {
                            "term": {
                                "name": "something"
                            }
                        }
                    }
                }
            }
        }
    }
    

    So if parent documents were blog posts and child comments, then you could filter all posts and score the comments based on weight. I doubt that scoring childs based on parents is possible though I might be wrong :)

    Disclaimer: 1st post to stack overflow...

    0 讨论(0)
提交回复
热议问题