2017-09-25 117 views
-1

我有以下對象:排序布爾嵌套子

[{ 
     "some_field": "some_value", 
     "nested_objects": [{ 
      "some_field2": "some_value", 
      "nested_objects2": [{ 
       "some_field": "some_value", 
       "bool_field": true 
      }, { 
       "some_field": "some_value", 
       "bool_field": true 
      }, { 
       "some_field": "some_value", 
       "bool_field": false 
      }] 
     }, { 
      "some_field2": "some_value", 
      "nested_objects2": [{ 
       "some_field": "some_value", 
       "bool_field": false 
      }, { 
       "some_field": "some_value", 
       "bool_field": false 
      }] 
     }] 
    }, 
    { 
     "some_field": "some_value", 
     "nested_objects": [{ 
      "some_field2": "some_value", 
      "nested_objects2": [{ 
       "some_field": "some_value", 
       "bool_field": false 
      }, { 
       "some_field": "some_value", 
       "bool_field": false 
      }, { 
       "some_field": "some_value", 
       "bool_field": true 
      }] 
     }] 
    } 
] 

所有嵌套的對象映射爲嵌套對象。我想根據第三級別的孩子bool值對頂級父級進行排序。具有更多布爾值的孩子應該比其他人高。

所以我基本上要由

_source.nested_objects.nested_objects2.bool_field 

對象更多的真實值進行排序的排名應該比別人高。

我也希望能夠過濾嵌套的對象,如:

_source.nested_objects.some_field == "some specific value" 

然後應計算分值僅適用於匹配的對象和匹配嵌套的對象。

這可能嗎?

回答

0

當我最初閱讀你的問題時,我認爲甚至不可能超越第一層嵌套。幸運的是,我能夠找到this論壇主題,這導致我可能的解決方案。

我想評論一下,我相信你會更好地重組你的數據。規範化數據並執行僞「連接」來計算值可能是一種選擇。

另一種選擇(以及我將學習的方法)是控制一個數值(在索引時使用這些對象傳遞的某種計數變量類型),或者包含一個腳本來爲您計算此值索引時間。在索引時間執行此計算可以避免此相對昂貴腳本的重複性成本。

不管你用它去哪裏,我想下面應該滿足當前的目標:格式化爲清潔閱讀

POST /test/_search 
{ 
    "query": { 
    "match_all": {} 
    }, 
    "sort": [ 
    { 
    "_script":{ 
     "type":"number", 
      "script": { 
     "lang": "painless", 
     "source": "int bool_sum = 0;for(int i = 0; i < params._source.nested_objects.length;i++){for(def j = 0; j < params._source.nested_objects[i].nested_objects2.length; j++){if(params._source.nested_objects[i].nested_objects2[j].bool_field == true)bool_sum++;}}return bool_sum;" 
    } 
    } 
    } 
    ] 
} 

討厭的小腳本:

int bool_sum = 0; 
    for(int i = 0; i < params._source.nested_objects.length;i++) 
     for(def j = 0; j < params._source.nested_objects[i].nested_objects2.length; j++){ 
      if(params._source.nested_objects[i].nested_objects2[j].bool_field == true) 
        bool_sum++; 
return bool_sum; 

我更新此基礎上您的意見,以便您可以使用輸入參數進行比較:

POST /test/_search 
{ 
    "query": { 
    "match": { 
     "nested_objects.nested_objects2.bool_field": true 
    } 
    }, 
    "sort": [ 
    { 
     "_script": { 
     "type": "number", 
     "script": { 
      "params": { 
      "value_to_match": false 
      }, 
      "lang": "painless", 
      "source": "int bool_sum = 0;for(int i = 0; i < params._source.nested_objects.length;i++){for(def j = 0; j < params._source.nested_objects[i].nested_objects2.length; j++){if(params._source.nested_objects[i].nested_objects2[j].bool_field == params.value_to_match)bool_sum++;}}return bool_sum;" 
     } 
     } 
    } 
    ] 
} 

和更新的腳本:

int bool_sum = 0; 
    for(int i = 0; i < params._source.nested_objects.length;i++) 
     for(def j = 0; j < params._source.nested_objects[i].nested_objects2.length; j++){ 
      if(params._source.nested_objects[i].nested_objects2[j].bool_field == params.value_to_match) 
        bool_sum++; 
return bool_sum; 
+0

在索引時計算值是不可能的,因爲我想能夠創建一個匹配嵌套對象的子集的查詢,然後我不想所有嵌套對象的聚合值。 –

+0

由於相同的原因,該腳本可能無法工作? –

+0

你是對的,如果你的目標是爲嵌套項目的子集計數,那麼根上的計算值將無效。但是,如果您擊中頂層對象,我不相信只有在返回父對象的同時才返回子對象的子集。 如果這是要求,我認爲規範化數據將是你最好的選擇。 – Miek

0

我可能已經找到了一些可行的方法。我可以創建嵌套查詢和嵌套對象的得分添加到父,如:

{ 
    "from": 0, 
    "size": 10, 
    "sort": [{ 
     "_score": { 
      "order": "desc" 
     } 
    }], 
    "query": { 
     "bool": { 
      "must": [{ 
       "nested": { 
        "query": { 
         "nested": { 
          "query": { 
           "term": { 
            "nested_objects.nested_objects2.bool_field": { 
             "value": true 
            } 
           }, 
           "score_mode": "sum" 
          }, 
          "path": "nested_objects.nested_objects2", 
          "score_mode": "sum", 
         } 
        }, 
        "path": "nested_objects", 
        "score_mode": "sum", 
       } 
      }] 
     } 
    } 
} 

如果我理解正確的話再根據匹配嵌套對象和多個匹配嵌套對象的父母會獲得更好的成績父母得分越高。

這是正確的嗎?