通过 Searchkick 按整数值对 Elasticsearch 结果进行排序
Sort Elasticsearch results by integer value via Searchkick
我正在开发一个 Rails 应用程序,它使用 Searchkick 作为 Elasticsearch 的接口。网站搜索工作正常,但我 运行 在一个页面上遇到了一个意外问题,我试图从几个不同的模型中检索 Searchkick 的最新记录。目标是最近 activity 的倒序列表,其中两种 object 类型混合在一起。
我正在使用以下代码:
models = [ Post, Project ]
includes = {
Post => [ :account => [ :profile ] ],
Project => [ :account => [ :profile ] ],
}
@results = Searchkick.search('*',
:models => models,
:model_includes => includes,
:order => { :id => :desc },
:limit => 27,
)
为了让后端正常工作,开发中的页面目前只显示标题、记录类型(class 名称)和 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。
因为 Elasticsearch 将 ID 存储为字符串而不是整数,我通过在 ES 中添加一个新的 obj_id
字段并根据该字段对结果进行排序来解决这个问题。
在我的 Post 和项目模型中:
def search_data
{
:obj_id => id,
:title => title,
:content => ActionController::Base.helpers.strip_tags(content),
}
end
并且在控制器中我将 order
值更改为:
:order => { :obj_id => :desc }
记录现在排序正确。
我正在开发一个 Rails 应用程序,它使用 Searchkick 作为 Elasticsearch 的接口。网站搜索工作正常,但我 运行 在一个页面上遇到了一个意外问题,我试图从几个不同的模型中检索 Searchkick 的最新记录。目标是最近 activity 的倒序列表,其中两种 object 类型混合在一起。
我正在使用以下代码:
models = [ Post, Project ]
includes = {
Post => [ :account => [ :profile ] ],
Project => [ :account => [ :profile ] ],
}
@results = Searchkick.search('*',
:models => models,
:model_includes => includes,
:order => { :id => :desc },
:limit => 27,
)
为了让后端正常工作,开发中的页面目前只显示标题、记录类型(class 名称)和 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。
因为 Elasticsearch 将 ID 存储为字符串而不是整数,我通过在 ES 中添加一个新的 obj_id
字段并根据该字段对结果进行排序来解决这个问题。
在我的 Post 和项目模型中:
def search_data
{
:obj_id => id,
:title => title,
:content => ActionController::Base.helpers.strip_tags(content),
}
end
并且在控制器中我将 order
值更改为:
:order => { :obj_id => :desc }
记录现在排序正确。