【问题标题】:ElasticSearch sort/score by deeply nestedElasticSearch 深度嵌套排序/评分
【发布时间】:2018-06-21 08:15:08
【问题描述】:

我的索引中有以下类型的文档,但由于深度嵌套方面,找不到正确排序的方法。

文档示例:

{
  "metadatas": [{
    "name": "name",
    "timeValidity": [{
      "since": "1970-01-01T00:00:00.000Z",
      "until": "2100-01-01T00:00:00.000Z",
      "value_s": "Some random name"
    }]
  }, {
    "name": "riskRatio",
    "variants": [{
      "value": "3Y",
      "timeValidity": [{
        "since": "2017-11-17T23:59:59.999Z",
        "until": "2017-12-01T23:59:59.998Z",
        "value_f": 0.6931
      }, {
        "since": "2017-12-01T23:59:59.999Z",
        "until": "2018-03-01T23:59:59.999Z",
        "value_f": 0.7215
      }, {
        "since": "2018-04-12T00:00:00.000Z",
        "until": "2018-04-16T23:59:59.999Z",
        "value_f": 0.6849
      }]
    }]
  }]
}

我希望在匹配时进行排序或提升,以便我可以获取由metadatas.variants.timeValidity.value_f (asc/desc) 排序的文档,并具有 metadata.name=riskRatio 和嵌套文档 metadata.variants.value=3Y 以及嵌套文档内的约束metadata.variants.timeValidity.since <= SOME_DATEmetadata.variants.timeValidity.until >= SOME_DATE

过滤结果很好。我的问题在于事物的排序方面。

script_score 似乎需要指定一个访问密钥,这是不可能的,因为我不知道数组中的位置。 sort 不允许我过滤两个属性的范围,因此它也是一个死胡同。所以我最后一次失败的尝试是像这样从下到上:

{
  "sort": [{
    "metadatas.variants.timeValidity.value_f": {
      "mode": "min",
      "order": "asc",
      "nested": {
        "path": "metadatas.variants.timeValidity",
        "filter": {
          "range": {
            "metadatas.variants.timeValidity.since": {
              "lte": "2018-01-21T23:59:59.999Z"
            },
            "metadatas.variants.timeValidity.until": { // forbidden !!
              "gte": "2018-01-21T23:59:59.999Z"
            }
          }
        },
        "nested": {
          "path": "metadatas.variants",
          "filter": {
            "match": {
              "metadatas.variants.value": "3Y"
            }
          },
          "nested": {
            "path": "metadatas",
            "filter": {
              "match": {
                "metadatas.name": "riskRatio"
              }
            }
          }
        }
      }
    }
  }]
}

如何正确排序?通过提升排序也可以,但对我来说是一条死胡同。

【问题讨论】:

    标签: sorting elasticsearch


    【解决方案1】:

    在查询中添加explain:true 非常有助于调试和了解正在发生的事情。

    这会给你一个额外的sort 键,通过点击显示它所用的值。

    为了能够查询两个范围,必须使用排序的filter 部分中的BooleanQuery。最终正确的查询如下:

    {
      "sort": [{
        "metadatas.variants.timeValidity.value_f": {
          "mode": "min",
          "order": "asc",
          "nested": {
            "path": "metadatas",
            "filter": {
              "match": {
                "metadatas.name": "riskRatio"
              }
            },
            "nested": {
              "path": "metadatas.variants",
              "filter": {
                "match": {
                  "metadatas.variants.value": "3Y"
                }
              },
              "nested": {
                "path": "metadatas.variants.timeValidity",
                "filter": {
                  "bool": {
                    "must": [{
                      "range": {
                        "metadatas.variants.timeValidity.since": {
                          "lte": "2018-01-21T23:59:59.999Z"
                        }
                      }
                    }, {
                      "range": {
                        "metadatas.variants.timeValidity.until": {
                          "gte": "2018-01-21T23:59:59.999Z"
                        }
                      }
                    }]
                  }
                }
              }
            }
          }
        }
      }]
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多