2015-10-28 31 views
1

前言爲什麼我的查詢忽略了我的過濾器聚合?

我Elasticsearch 1.7.2 4天的經歷。

設置

我的文檔的集合,每個文檔是一個UserUser有多個Answers,它通過UserAnswers連接。其中給出了user_answers.answer[]的文檔參考。 answers數組是一個對象數組。

user_answers.answer[].correct是一個布爾字段,告訴我用戶給出的答案是否正確。

目的

我想列出的用戶,也顯示他們有正確和不正確的答案的總數。

方法

到目前爲止,我已經嘗試了許多不同的方法和我在試圖1.5天這麼遠的一個,我會在這裏包括是接近。

  • 使用terms聚合通過用戶名爲每個User創建一個存儲桶。
  • 篩選每個存儲桶只留下正確或不正確的答案。
  • 計算篩選答案的數量。

查詢

{ 
    "size": 0, 
    "filter": { 
     "bool": { 
      "must_not": { 
       // Remove users who already have this award 
       "term": {"awards_users.award_id": 2} 
      } 
     } 
    }, 
    "aggs": { 
     "users": { 
      "terms": {"field": "username"}, 
      "aggs": { 
       "correct": { 
        "filter": { 
         "term": {"user_answers.answer.correct": true} 
        }, 
        "aggs": { 
         "count": { 
          "value_count": { 
           "field": "user_answers.answer.id" 
          } 
         } 
        } 
       }, 
       // Same for incorrect, but inverted correct value 
      } 
     } 
    } 
} 

樣本響應

{ 
    "key": "neon1024", 
    "doc_count": 1, 
    "correct": { 
    "doc_count": 1, 
    "count": { 
     "value": 7 // Expected 1 correct & 6 incorrect 
    } 
    } 
}, 

這是我對測試記錄,我期待的是1返回,而不是7。共有7個答案,6個不正確和1個正確答案。這我已在我的文檔索引中進行過驗證。

問題

出於某種原因,實際的過濾器似乎被忽略,而留在桶中的所有可能的相關答案。因此,聚合看到他們全部,而不是顯示預期的價值。

問題

我如何使用聚合基於相關答案值的值,以隔離我計數?

感謝您閱讀我的長問題!

+1

映射中'user_answers.answer'是一個嵌套對象嗎?如果不是,那可能是問題。嘗試並使其嵌套並使查詢和聚合適應使用'nested',它應該在事後工作。 – Val

回答

0

如上所示,您可能已將您的答案映射爲object,而您應該使用nested類型。

使用嵌套類型,elasticsearch會將您的答案存儲爲鏈接到根文件的單個文檔,並且可以讓您對它們執行預期的聚合。您必須在查詢中使用嵌套類型聚合來實現這一點。

所以我會說這將是最好的文檔映射是這樣的:

PUT /test 
{ 
    "mappings" : { 
    "your_type" : { 
     "properties" : { 
     "username" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
     }, 
     "user_answers" : { 
      "type" : "nested", 
      "properties" : { 
      "id" : { 
       "type" : "integer" 
      }, 
      "answer" : { 
       "type" : "string" 
      }, 
      "correct" : { 
       "type" : "boolean" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

測試文件:

PUT /test/your_type/1 
{ 
    "username": "neon1024", 
    "user_answers": [ 
    { 
     "id": 1, 
     "answer": "answer1", 
     "correct": true 
    }, 
    { 
     "id": 2, 
     "answer": "answer2", 
     "correct": true 
    }, 
    { 
     "id": 3, 
     "answer": "answer3", 
     "correct": false 
    } 
    ] 
} 

查詢:

POST /test/_search?search_type=count 
{ 
    "aggs": { 
    "users": { 
     "terms": { 
     "field": "username" 
     }, 
     "aggs": { 
     "DiveIn": { 
      "nested": { 
      "path": "user_answers" 
      }, 
      "aggs": { 
      "CorrectVsIncorrect": { 
       "terms": { 
       "field": "user_answers.correct", 
       "size": 2 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

和最終的結果:

{ 
    "took": 6, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "users": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "neon1024", 
       "doc_count": 1, 
       "DiveIn": { 
        "doc_count": 3, 
        "CorrectVsIncorrect": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [ 
         { 
          "key": "T", 
          "doc_count": 2 
         }, 
         { 
          "key": "F", 
          "doc_count": 1 
         } 
        ] 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

其中"key": "T"代表正確答案,"doc_count": 2代表它們的數量。

+0

爲什麼@Evaldas和val總是首先回答。嘆。!!無論如何這兩個人建議是正確的答案。只是出於好奇心,爲什麼當第二次聚合給你的文檔數時,你需要第三次聚合計數:-) – piyushGoyal

+0

@piyushGoyal小細微差別:我沒有回答,只是在我嘗試回答之前要求澄清; - ) – Val

+0

@Val我在我的手機上,我認爲它應該足夠了。我會舉個簡單的例子。也許我會擺脫這種倒退。 :) –

相關問題