1

假设我有一些名为“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" ]
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}
4

1 回答 1

4

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

  • 有孩子的记录(musthas_childcustom_score计算)
  • 没有孩子的记录(must_nothas_child和默认分数)
{
  “询问”: {
    “custom_score”:{
      “脚本”:“_score”,
      “询问”: {
        “过滤”:{
          “询问”: {
            “布尔”:{
              “应该” : [
                {
                  “布尔”:{
                    “必须” : {
                      “有孩子”:{
                        “类型”:“人”,
                        “score_type”:“总和”,
                        “询问”: {
                          “custom_score”:{
                            "script": "doc['person.age'].value - 50d",
                            “询问”: {
                              “匹配全部”:{}
                            }
                          }
                        }
                      }
                    }
                  }
                },
                {
                  “布尔”:{
                    “一定不” : {
                      “有孩子”:{
                        “类型”:“人”,
                        “询问”: {
                          “匹配全部”:{}
                        }
                      }
                    }
                  }
                }
              ]
            }
          },
          “筛选”: {
            “布尔”:{
              “应该”: [
                {
                  “条款”:{
                    "room_id": ["1","2","3","4","5"]
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}
于 2013-11-08T21:49:13.007 回答