2014-09-05 160 views
0

我有一個索引與各種類型的用戶可能有不同的訪問權限爲每種類型。所有記錄都有path字段,用於確定用戶可以看到和不能看到的內容。這裏有記錄的例子:ElasticSearch匹配路徑

id: 12 type: Project path: projects/12     content: … 
id: 874 type: Task  path: projects/12/public/tasks/874 content: … 
id: 3 type: User  path: users/4      content: … 

如果我知道,用戶可以看到users/12users/14users/18,並且projects/*/public/*,你會如何的結構,僅過濾匹配的記錄,並搜索內部content場查詢?使用SQL很容易(並且建立在數據庫的FULLTEXT索引周圍),但是我需要使其與ElasticSearch配合使用。

回答

0

您可以使用簡單的bool查詢來實現此目的。對於您提到的特定實例,請嘗試下面的查詢(用實際索引名稱替換<index>)。這將執行所有類型的搜索。當然,你的代碼需要足夠的通用性來生成合適的should子句(術語或通配符等)。

POST <index>/_search 
{ 
    "fields": [ 
     "content" 
    ], 
    "query": { 
     "bool": { 
      "should": [ 
       { 
        "term": { 
         "path": "users/12" 
        } 
       }, 
       { 
        "term": { 
         "path": "users/14" 
        } 
       }, 
       { 
        "wildcard": { 
         "path": "projects/*/public/*" 
        } 
       } 
      ] 
     } 
    } 
}