如何从嵌套对象中的根对象添加属性进行排序?

时间:2015-11-09 21:18:15

标签: elasticsearch

我们索引中文档类型的简化示例:

{ 
  "organisation" : { 
    "code" : "01310"
  },
  "publications" : [ 
    { 
      "dateEnd" : 1393801200000,
      "dateStart" : 1391986800000,
      "code" : "PUB.02"
    },
    { 
      "dateEnd" : 1401055200000,
      "dateStart" : 1397512800000,
      "code" : "PUB.06"
    }
  ]
}

请注意publications被映射为nested个对象,因为我们需要根据dateEnddateStartpublicationStatus属性的组合进行过滤。< / p>

PUB.02状态代码很特殊。它声明:'如果当前用户是该组织的成员,则此发布期有效。

当我想对'最近'进行排序时,我遇到了问题:

{
  "sort": {
    "publications.dateStart" : {
      "mode" :  "min",
      "order" : "desc",
      "nested_filter" : {
        "or" : [
          {
            "and" : [
              { "term" : { "organisation.code" : "01310" } },
              { "term" : { "publications.code" : "PUB.02" } }
            ]
          },
          { "term" : { "publications.code" : "PUB.06" } }
        ]
      }
    }
  }
}

没有给出错误,但忽略了PUB.02条目。我尝试在映射中使用copy_toorganisation.code的值复制到nested对象,但这没有帮助。

  • 有没有办法在嵌套排序中找到父文档?
  • 或者,有没有办法将数据从父文件复制到嵌套文档?

我目前正在使用Elasticsearch 1.7版而无法使用脚本。如果这有助于这种情况,可以升级到更新的版本。

这个要点表明排序是在PUB.06出版物上进行的:https://gist.github.com/EECOLOR/2db9a1ec9d6d5c791ea6

1 个答案:

答案 0 :(得分:1)

虽然文档没有明确提及,但看起来我们无法访问嵌套过滤器上下文中的父字段。

此外,我无法使用copy_to将数据从根/父字段添加到嵌套文档。我建议在elasticsearch discuss thread询问你会有更多的运气原因。

在某些触发器之前,我很想补充一点,使用sort解决方案可以使用 a) use filtered query to filter documents with the `organisation.code : 01310` b) then score these documents based on max value of reciprocal of nested document **dateStart** with terms **PUB2.0 PUB6.0** 来实现OP中所需的查询和预期结果。

实现此目的的一个实现如下

1)使用should查询开始

2)在第一个应用条款

 a) use filtered query  to filter documents with those with `organisation.code not equal to  01310`

  b) like before score these documents  based on max value of reciprocal of  nested document **dateStart** with term **PUB6.0** only

3)在第二个应用条款

POST /testindex/testtype/_search 
{
   "query": {
      "bool": {
         "should": [
            {
               "filtered": {
                  "filter": {
                     "term": {
                        "organisation.code": "01310"
                     }
                  },
                  "query": {
                     "nested": {
                        "path": "publications",
                        "query": {
                           "filtered": {
                              "query": {
                                 "function_score": {
                                    "functions": [
                                       {
                                          "field_value_factor": {
                                             "field": "publications.dateStart",
                                             "modifier": "reciprocal"
                                          }
                                       }
                                    ],
                                    "boost_mode": "replace",
                                    "score_mode": "max"
                                 }
                              },
                              "filter": {
                                 "terms": {
                                    "publications.code": [
                                       "PUB.02",
                                       "PUB.06"
                                    ]
                                 }
                              }
                           }
                        },
                        "score_mode": "max"
                     }
                  }
               }
            },
            {
               "filtered": {
                  "filter": {
                     "not": {
                        "term": {
                           "organisation.code": "01310"
                        }
                     }
                  },
                  "query": {
                     "nested": {
                        "path": "publications",
                        "query": {
                           "filtered": {
                              "query": {
                                 "function_score": {
                                    "functions": [
                                       {
                                          "field_value_factor": {
                                             "field": "publications.dateStart",
                                             "modifier": "reciprocal"
                                          }
                                       }
                                    ],
                                    "boost_mode": "replace",
                                    "score_mode": "max"
                                 }
                              },
                              "filter": {
                                 "terms": {
                                    "publications.code": [
                                       "PUB.06"
                                    ]
                                 }
                              }
                           }
                        },
                        "score_mode": "max"
                     }
                  }
               }
            }
         ]
      }
   }
}

示例查询:

copy_to

我首先承认它不是最具可读性的,如果有一种方法'copy_to'嵌套它会更理想

如果没有通过在索引之前在客户端中注入数据来模拟Makefile,那么索引将变得更加简单和灵活。

但上面是一个如何使用功能分数完成的例子。