【问题标题】:Sort Elasticsearch results by integer value via Searchkick通过 Searchkick 按整数值对 Elasticsearch 结果进行排序
【发布时间】:2022-01-21 02:36:01
【问题描述】:

我正在开发一个使用 Searchkick 作为 Elasticsearch 接口的 Rails 应用程序。站点搜索运行良好,但我在尝试从 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 进行测试,发现对于包含约 7,000 条记录的表,999 被认为是最高的,而 6905 在列表中排在 691 之后。

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

我正在运行 Searchkick 4.4 和 Elasticsearch 7。

【问题讨论】:

  • 你的问题是ES返回的结果中包含字符串格式的ID?
  • 在文档中它说:By default, ids are fetched from Elasticsearch and records are fetched from your database. 另外,为什么 ID 是一个字符串是一个问题?
  • @Abhinay 记录 ID 是个问题,因为数字字符串的排序方式与整数不同,如上所述。

标签: ruby-on-rails elasticsearch searchkick


【解决方案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 }

记录现在排序正确。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多