通过Searchkick按整数值对Elasticsearch结果进行排序



我正在开发一个Rails应用程序,该应用程序使用Searchkick作为Elasticsearch的接口。网站搜索运行得很好,但我在一个页面上遇到了一个意想不到的问题,我试图从几个不同的模型中检索Searchkick的最新记录。目标是将这两种对象类型混合在一起,按时间倒序列出最近的活动。

我使用以下代码:

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进行了测试,发现在包含约7000条记录的表格中,999条被认为是最高的,而6905条排在691条之后。

在Elasticsearch文档中,我确实看到了对数字字段排序的提及,但我不知道如何将其转换为Seachkick DSL。这可能并得到支持吗?

我正在运行Searchkick 4.4和Elasticsearch 7。

因为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 }

记录现在正在正确排序。

最新更新