是的,這是絕對有可能,你可以做這樣的:
{
"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