基于searchkick中的两个唯一字段(与SQLDistinct相同)获取结果

vc6uscn9  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(772)

我有一个 Follow 具有(除其他外)两个属性的模型 follower_id 以及 followable_id .
这是搜索数据定义:

{
  name: [followable.name, follower.name],
  username: [followable.username, follower.username],
  followable_id: followable_id,
  follower_id: follower_id
}

我想执行一个搜索,返回唯一的结果,考虑到字段[followable\u id,follower\u id]。我认为这和 SELECT DISTINCT ON followable_id, follower_id FROM "follows" .
例如, [[10, 2], [2, 5], [2, 10]] 你应该回来 [[10, 2], [2, 5]] 或者 [[2, 5], [2, 10]] ,对我来说,顺序没什么区别。对我来说,重要的是两人不重复。
我当前的搜索结果如下:

search = Follow.search('*',
  fields: [:name, :username],
  match: :word_start,
  misspellings: {below: 5},
  page: params[:page],
  per_page: 10,
  where: {_or: [
    {follower_id: current_user.id}, 
    {followable_id: current_user.id}
  ]}
)

编辑:
我以为他们可以相似。但是,我尝试了以下方法:

SELECT DISTINCT ON (follower_id, followable_id) follower_id, followable_id FROM "follows";

 follower_id | followable_id 
-------------+---------------
          27 |            35
          28 |            12
          33 |            27
          35 |            27

在这个例子中,它不应该返回 [27, 35] 或者 [35, 27] . 但如您所见,查询确实返回了重复对。

yshpjwxd

yshpjwxd1#

我不知道searchkick,但是我可以分享e.s等价物(如果有帮助的话),你可以把它转换成searchkick等价物。

{
  "size": 0,
  "aggs": {
    "distinct": {
      "terms": {
        "script": {
          "source": "doc['follower_id'] + '|' + doc['followable_id']"
        },
        "size": 100
      }
    }
  }
}

相关问题