ElasticSearch按子字段使用默认值对父文档进行评分

时间:2013-11-08 06:14:44

标签: c# elasticsearch nest

假设我有一些名为“room”的父文档,以及一些名为“person”且具有“age”字段的子文档。现在我想使用ES中的custom_score查询使用年龄字段为某些房间评分。

我已经使查询工作几乎与预期一致,唯一的问题是:空房间(没有子文档)没有得分。我怎样才能给他们一个默认分数。在这个例子中,我想用room_id 1~5得分五个房间。如果4号房间没有儿童文件,则不会被评分。该查询将只有4个具有预期分数的记录。我想要的是给空房间一个默认分数。也许功能评分查询适用于这种情况,但我使用NEST作为.NET客户端,目前不支持功能评分查询。

顺便说一句:SO的CSS在这里不起作用,我不知道为什么。如果这篇文章格式不正确,请帮助编辑,谢谢。

{
  "query": {
    "custom_score": {
      "script": "_score",
      "query": {
        "filtered": {
          "query": {
            "has_child": {
              "type": "person",
              "score_type": "sum",
              "query": {
                "custom_score": {
                  "script": "doc['person.age'].value - 50d",
                  "query": {
                    "match_all": {}
                  }
                }
              }
            }
          },
          "filter": {
            "bool": {
              "should": [
                {
                  "terms": {
                    "room_id": [ "1", "2", "3", "4", "5" ]
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:4)

您的has_child过滤器使其仅包含具有子项的父记录,但您需要所有父记录。你可以使用bool来查询两个should子句:

  • 有孩子的记录(must计算has_childcustom_score
  • 没有孩子的记录(must_not带有has_child和默认分数)
{
  "query": {
    "custom_score": {
      "script": "_score",
      "query": {
        "filtered": {
          "query": {
            "bool" : {
              "should" : [
                {
                  "bool" : {
                    "must" : {
                      "has_child": {
                        "type": "person",
                        "score_type": "sum",
                        "query": {
                          "custom_score": {
                            "script": "doc['person.age'].value - 50d",
                            "query": {
                              "match_all": {}
                            }
                          }
                        }
                      }
                    }
                  }
                },
                {
                  "bool" : { 
                    "must_not" : {
                      "has_child": {
                        "type": "person",
                        "query": {
                          "match_all": {}
                        }
                      }
                    }
                  }
                }
              ]
            }
          },
          "filter": {
            "bool": {
              "should": [
                {
                  "terms": {
                    "room_id": ["1","2","3","4","5"]
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}