我现在正在调查弹性搜索,我想了解某些事情的可能性。任何建议将不胜感激。
我正在努力解决一个非常具体的用例如下:
我想在弹性搜索中进行聚合之前对每一行运行权利检查?这可能吗?
这就像调用外部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
}
]
}
}
}