2016-07-21 36 views
0

我有一個包含多個角色文件/右定義爲嵌套對象的數組:elasticsearch - 通過精確匹配一個嵌套的對象找到文件

{ 
    ... 
    'roleRights': [ 
    {'roleId':1, 'right':1}, 
    {'roleId':2, 'right':1}, 
    {'roleId':3, 'right':2}, 
    ] 
} 

我想具體roleRights過濾出的文檔,但我查詢似乎混合組合。這是我filterQuery爲「僞」

boolFilter > must > termQuery >roleRights.roleId: 1 
boolFilter > must > termQuery >roleRights.type: 2 

以上應該只返回已分配右2

作用1

  • 文件,但它看起來像我得到

    • 所有具有角色1分配的文檔無視權利
    • 以及所有權利爲2的所有文檔均不承擔任何責任。

    任何提示?

+0

你可以分享你的映射呢? 'roleRights'很可能不是嵌套類型,它應該是。 – Val

+0

你是對的。 roleRights未映射爲嵌套。這真的有必要嗎?我是否需要使用nestedQueries? – Philipp

+0

是的,這是必要的。請參閱下面的答案。 – Val

回答

1

您需要映射roleRightsnested(見good explanation here),如下圖所示:

PUT your_index 
{ 
    "mappings": { 
    "your_type": { 
     "properties": { 
     "roleRights": { 
      "type": "nested", 
      "properties": { 
      "roleId": { "type": "integer" }, 
      "right": { "type": "integer" } 
      } 
     } 
     } 
    } 
    } 
} 

確保先刪除索引,重新創建和重新填充它。

然後,你就可以讓你的查詢是這樣的:

POST your_index/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "nested": { 
        "path": "roleRights", 
        "query": { 
        "term": { "roleRights.roleId": 1} 
        } 
       } 
      }, 
      { 
       "nested": { 
        "path": "roleRights", 
        "query": { 
        "term": { "roleRights.type": 2} 
        } 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Bravo!非常感謝你!剛剛發現這個[link](https://www.elastic.co/guide/en/elasticsearch/guide/current/complex-core-fields.html#object-arrays) - >用「數組對象」解釋我的問題 – Philipp

+0

很高興幫助! – Val