是的,这是绝对有可能,你可以做这样的:
{
"sort": {
"_script": {
"type": "number",
"script": {
"inline": "def store1 = _source.resellers.find{it.name == store1}; def store2 = _source.resellers.find{it.name == store2}; (store1 != null && store2 != null) ? store1.price - store2.price : 0",
"lang": "groovy",
"params": {
"store1": "storeA",
"store2": "storeB"
}
},
"order": "asc"
}
},
"query": {
"bool": {
"filter": [
{
"script": {
"script": {
"inline": "def store1 = _source.resellers.find{it.name == store1}; def store2 = _source.resellers.find{it.name == store2}; (store1 != null && store2 != null) ? store1.price < store2.price : false",
"lang": "groovy",
"params": {
"store1": "storeA",
"store2": "storeB"
}
}
}
}
]
}
}
}
排序脚本是这样的:
def store1 = _source.resellers.find{it.name == store1};
def store2 = _source.resellers.find{it.name == store2};
(store1 != null && store2 != null) ? store1.price - store2.price : 0
过滤器脚本有点相似,看起来是这样的:
def store1 = _source.resellers.find{it.name == store1};
def store2 = _source.resellers.find{it.name == store2};
(store1 != null && store2 != null) ? store1.price < store2.price : false
这两个脚本在输入中都带有两个参数,即经销商的名称将您w蚂蚁来比较。
UPDATE
不知怎的,我忘了解释为什么它不可能与DOC值做到这一点。 Doc值实际上是倒排索引的倒数,即每个文档都被映射为该文档内存在的令牌。这再加上嵌套的文件保存为独立的(但隐藏)在索引文件的事实,像下面
{
"id": 1,
"product": "Water",
"resellers": [
{
"name": "storeA",
"price": 20
},
{
"name": "storeB",
"price": 30
}
]
}
的一个文档的DOC值应该是这样的:
Document | Values
----------------+---------------------------
1 (top-level) | water
1a (1st nested} | storea, 20
1b (2nd nested} | storeb, 30
查看上面的表格,并且由于脚本是在每个文档的上下文中执行的(无论是顶层还是嵌套),显而易见的是,当访问脚本中的doc值时只会生成该文档的值,因此它无法将它们与另一个文档中的值进行比较。
访问源代码时,我们有效地遍历了resellers
数组,因此可以比较它们之间的值并生成在您的上下文中很有用的东西。
来源
2017-03-18 06:18:08
Val
在此操作。同意这将工作,但根据原始问题,我正在寻找一种涉及doc值的解决方案,而不是使用'_source',因为使用'_source'需要(相当于)全表扫描,这对于我的目的来说太慢。如果这是不可能的,那么我会很好地解释为什么不这样做。谢谢 –
你是对的,我忘记了包括为什么不能用doc值来做到这一点。 – Val