我们索引中文档类型的简化示例:
{
"organisation" : {
"code" : "01310"
},
"publications" : [
{
"dateEnd" : 1393801200000,
"dateStart" : 1391986800000,
"code" : "PUB.02"
},
{
"dateEnd" : 1401055200000,
"dateStart" : 1397512800000,
"code" : "PUB.06"
}
]
}
请注意publications
被映射为nested
个对象,因为我们需要根据dateEnd
,dateStart
和publicationStatus
属性的组合进行过滤。< / 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_to
将organisation.code
的值复制到nested
对象,但这没有帮助。
我目前正在使用Elasticsearch 1.7版而无法使用脚本。如果这有助于这种情况,可以升级到更新的版本。
这个要点表明排序是在PUB.06
出版物上进行的:https://gist.github.com/EECOLOR/2db9a1ec9d6d5c791ea6
答案 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
,那么索引将变得更加简单和灵活。
但上面是一个如何使用功能分数完成的例子。