Elasticsearch的nested過濾
記錄一個對nested巢狀文件的過濾問題,這兩天一不小心踩了個小坑。
我有一個nested欄位是這樣定義的:
'main_category' => [ 'type' => 'nested', 'dynamic' => false, 'properties' => [ 'id' => [ // 分類ID 'type' => 'long', ], 'level' => [ // 層級 'type' => 'integer', ], 'parent_id' => [ // 父分類 'type' => 'long', ], 'title' => [ // 標題 'type' => 'keyword', ], 'nicktitle' => [ // 別名 'type' => 'keyword', ], ], ],
需求:符合條件的父文件必須包含至少一個滿足下面條件的main_category子文件:
- level=1
- id=10
因為查詢還包含對父文件的一些過濾條件,所以我當時的查詢就寫成了這樣:
{ "query": { "bool": { "filter": [{ "nested": { "path": "main_category", "query": { "term": { "main_category.id": 10 } } } }, { "nested": { "path": "main_category", "query": { "term": { "main_category.level": 1 } } } }] } } }
這個查詢的意思是,有任意一個main_category滿足id=10,有另外任意一個main_category滿足level=1即可,即滿足2個條件的子文件不必是同一個,所以得到的結果是錯誤的。
正確的做法應該是先通過nested關鍵字進入到子文件的上下文中,然後過濾同時滿足2個條件的子文件:
{ "query": { "bool": { "filter": [{ "nested": { "path": "main_category", "query": { "bool": { "filter": [{ "term": { "main_category.id": 10 } }, { "term": { "main_category.level": 1 } }] } } } }] } } }
經過nested進入子文件上下文,然後執行普通的bool過濾即可filter得到同時滿足2個條件的子文件,那麼對應的父文件也就滿足了條件。
本篇部落格完~