2017-04-18 92 views
4

我想使用多個值對嵌套的Elasticsearch進行排序。這裏有一個例子:在Elasticsearch上嵌套排序多個值

我有一些Events,其中有一個嵌套topics,這樣

"_source": { 
     "topics": [ 
     { 
      "type": "Tools", 
      "name": "Data Science", 
      "id": 19 
     }, 
     { 
      "type": "Challenges", 
      "name": "Disaster Resilience", 
      "id": 1 
     }, 
     { 
      "type": "Tools", 
      "name": "Entrepreneurship", 
      "id": 21 
     }, 
     { 
      "type": "Challenges", 
      "name": "Prosperity", 
      "id": 8 
     } 
     ] 
     ... 
    } 

此外,Members具有相同的嵌套topics,使用相同的結構。

我想要做的是排序 Events根據會員話題。例如,如果一個會員有三個與事件相匹配的主題,兩個與另一個相匹配,我想首先顯示最匹配的事件。

我想是這樣的:

"sort":[ 
     { 
     "topics.id":{ 
      "nested_path":"topics", 
      "mode":"sum", 
      "order":"asc", 
      "nested_filter":{  
       "match": { 
       "topics.id": 13 
       } 
      } 
     } 
     } 
    ] 

這對於一個特定的主題作品。但我想在下面做這樣的事情,使用sort中的多個值,首先返回最匹配的事件。在這種情況下,包含主題13和14的事件將首先被返回,而不是僅包含主題13的事件,並且所有其他不匹配的事件將在後面顯示。

"sort":[ 
     { 
     "topics.id":{ 
      "nested_path":"topics", 
      "mode":"sum", 
      "order":"asc", 
      "nested_filter":[  
       { 
       "match": { 
        "topics.id": 13 
       } 
       }, 
       { 
       "match": { 
        "topics.id": 14 
       } 
       } 
      ] 
     } 
     } 
    ] 

編輯:下面是我用這最後的片段時,得到的錯誤:

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "illegal_argument_exception", 
     "reason": "[field_sort] nested_filter doesn't support values of type: START_ARRAY" 
     } 
    ], 
    "type": "illegal_argument_exception", 
    "reason": "[field_sort] nested_filter doesn't support values of type: START_ARRAY" 
    }, 
    "status": 400 
} 

但這不幸的是不起作用。有沒有辦法做到這一點?我在這裏錯過了一些非常棒的功能嗎?

謝謝!

+0

這是什麼?你能發佈回覆以及預期的迴應嗎? – user3775217

+0

剛剛用響應編輯。預期的響應在之前的段落中描述,有關事件排序。 –

回答

0

我能夠使用無痛腳本來解決這個問題。如果這是性能方面的話,我不會這麼做,但它工作正常。如果我找到更好的解決方案,也會發布這個。

{ 
    "query":{ 
     "bool":{ 
     "must":[ 
      { 
       "nested":{ 
        "path":"topics", 
        "query":{ 
        "function_score":{ 
         "script_score":{ 
          "script":{ 
           "lang":"painless", 
           "params":{ 
           "ids":[ 
            1, 
            14, 
            19, 
            13, 
            19, 
            21, 
            8 
           ] 
           }, 
           "inline":"int s = 0; for (int i = 0; i < params.ids.length; i++){ for (int j = 0; j < doc['topics.id'].value; j++) { if (params.param1[i] == doc['topics.id'][j]) { s =+ 1 }}} return s" 
          } 
         } 
        } 
        } 
       } 
      } 
     ] 
     } 
    } 
}