在每个用户的基础上隐藏Elastic Search中的单个记录

时间:2017-02-16 16:07:36

标签: elasticsearch

作为登录用户,如果我执行相同的搜索,我希望能够隐藏我再也不想看到的单个记录。 ElasticSearch可以实现吗?

我已经阅读了有关多租户和过滤器的信息,但我不太清楚顶级实现的外观如何。

我的一个想法是,我在RDB中存储对不需要的记录的一些引用,然后将这些引用添加到过滤器查询中,但我不确定使用什么引用,因为弹性搜索会生成它#s; s当重新索引发生时,自己的ID可能不会保持不变。

1 个答案:

答案 0 :(得分:1)

这取决于。如果你没有太多的用户而没有太大的文档,你可以在文档中使用字段,添加字段 dismissedBy ,并在使用时将写入更新写入文档

POST test/type1/1/_update
{
    "script" : {
        "inline": "ctx._source.dismissedBy.add(params.userId)",
        "lang": "painless",
        "params" : {
            "userId" : "1"
        }
    }
}

并查询:

POST /index/documents/_search
{
  "query": {
    "bool": {
      "must_not": {
        "term": {
          "dismissedBy": 1
        }
      }
    }
  }
}
使用这种方法的

问题是,如果您重新索引文档,所有设置都将被覆盖,因此您也必须在其他地方保留副本。

其他选项如果文档很大或者您有很多用户,那么我会选择parent/child approach

如果用户点击关闭,则应将其编入索引

PUT /indexname/dissmisses/1?parent=dismissforid
{
  "userId":  1
}

然后当你搜索时

POST /index/documents/_search
{
  "query": {
    "bool": {
      "must_not": {
        "has_child": {
          "type": "dissmiss",
          "query": {
            "term": {
              "userId": 1
            }
          }
        }
      }
    }
  }
}