提问者:小点点

通过Searchkick按整数值对弹性搜索结果进行排序


我正在开发一个Rails应用程序,它使用Searchki作为Elasticsearch的接口。站点搜索工作得很好,但是我在一个页面上遇到了一个意想不到的问题,我试图在几个不同的模型中检索Searchkit的最新回复。目标是最近活动的反向时间列表,两种对象类型混合在一起。

我使用以下代码:

models = [ Post, Project ]
includes = { 
    Post    => [ :account => [ :profile ] ], 
    Project => [ :account => [ :profile ] ],
}
@results = Searchkick.search('*', 
    :models => models,
    :model_includes => includes,
    :order => { :id => :desc },
    :limit => 27,
)

为了使后端正常工作,开发中的页面当前仅显示标题,记录类型(类名)和ID,如下所示:

<%= "#{result.title} (#{result.class} #{result.id})" %>

哪个将输出这个:

Greetings from Tennessee! (Post 999)

这通常看起来工作正常,除了ES将按ID排序的结果作为字符串而不是整数返回。我通过将结果限制设置为1000进行了测试,发现对于包含约7,000条记录的表,999被认为是最高的,而6905在列表中位于691之后。

通过查看ElasticSearch留档,我确实看到了对数字字段进行排序的提及,但我无法弄清楚如何将其转换为SeachkitDSL。这可能并得到支持吗?

我运行的是Searchkick 4.4和Elasticsearch 7。


共1个答案

匿名用户

由于 Elasticsearch 将 ID 存储为字符串而不是整数,因此我通过在 ES 中添加一个新的 obj_id 字段并基于该字段对结果进行排序来解决此问题。

在我的帖子和项目模型中:

def search_data
    {
        :obj_id => id,
        :title => title,
        :content => ActionController::Base.helpers.strip_tags(content),
    }
end

在控制器中,我将order值更改为:

:order => { :obj_id => :desc }

记录现在排序正确。