在弹性搜索中拦截聚合查询

时间:2017-02-05 03:12:25

标签: java elasticsearch elasticsearch-plugin spring-data-elasticsearch

我现在正在调查弹性搜索,我想了解某些事情的可能性。任何建议将不胜感激。

我正在努力解决一个非常具体的用例如下:

我想在弹性搜索中进行聚合之前对每一行运行权利检查?这可能吗?

这就像调用外部api来查看用户是否有权在特定行上进行聚合一样,如果是,则应将其添加到聚合结果集中。

示例:

让我们说,我在弹性搜索中有一些文档数据,每个文档都附有一个特定的标记。我在另一个关系数据库中有一些用户数据,具有以下模式(userId,tag)

当user1查询弹性标签“es”上的文档数量时,它应该返回2,而对于user2,它应该返回0,因为用户没有附加“es”标签。

这就像拦截每次对聚合的调用一样,在增加计数之前进行一些自定义检查。基本上我希望将搜索结果限制为基于用户的内容。

弹性搜索中的架构和查询

PUT /document
{
    "mappings": {
        "post": {
            "properties": {
                "document_id": {
                    "type":"integer"
                },
                "tag": {
                    "type":"string",
                    "index":"not_analyzed"
                },
                "document_name": {
                    "type":"string"
                }
            }
        }
    }
}


POST document/reports 
{
    "document_id":123,
    "tag":"es",
    "document_name":"elastic search indexing"
}

POST document/reports 
{
    "document_id":1233,
    "tag":"es",
    "document_name":"elastic search routing"
}


POST document/reports 
{
    "document_id":1234,
    "tag":"kafka",
    "document_name":"kafka partitioning"
}

关系数据库中的表结构

userId | tag            |
-------------------------
 user1 | es             |
 user2 | kafka          |

搜索请求查询

GET document/reports/_search
{
    "query": {
        "match": {
            "_all": "es"
        }
    },
    "size": 0,
    "aggs": {
        "types": {
            "terms": {
                "field":"tag"
            }
        }
    }
}

示例回复

{
   "took": 4,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "types": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "es",
               "doc_count": 2
            }
         ]
      }
   }
}

0 个答案:

没有答案