【发布时间】:2021-04-19 06:21:14
【问题描述】:
我正在使用 SearchKick,这很棒,我从一个非常糟糕的搜索实施迁移,产品团队在迁移到 SearchKick 并对我们的搜索进行大修之前并没有给予我太多信任,他们让我添加了硬编码的查询结果,所以他们可以说对于这个搜索输入,我希望这个产品首先出现。现在我从数据库中获取回答某个请求查询的查询结果并将它们添加到顶部(我不在乎你是否想要位置 48 的结果,如果有 4 个硬编码结果,它将是第 4 个)。虽然如果可能的话,最好把它们放在中间。
使用 SearchKick 最简洁的方法是什么,以便查询将在弹性内部发生(索引产品中的硬编码结果以执行此操作)
我有 2 个模型 Product 和 QueryResult,QueryResult 包含一个产品、一个查询字符串和一个 Wanted_rank
在我的产品模型中,我确实有一种方法可以获取如下所示的搜索结果:
def get_search_results(query_string)
# get search results from elastic using searchkick
search_results = Product.search(query_string)
# get hardcoded results matching this query
hardcoded_results = QueryResults.where(query: query).order(:wanted_rank).map(&:product)
# remove hardcoded results from search_results
search_results = search_results - hardcoded_results
# return results where hardcoded results are first
hardcoded_results + search_results
end
最后,我希望所有搜索逻辑都通过弹性进行,包括插入硬编码的搜索结果
【问题讨论】:
-
到目前为止,对于每个具有硬编码结果的产品,我都会在产品中的查询下反向索引排名(LARGE_NUMBER - 排名),例如,如果我有这样的硬编码结果:{ product: x, query : 'lol', rank: 2 } 比产品 x 的 json 看起来像这样: { name: x, hardcoded: { lol: LARGE_NUMBER - 2 } } 比 i boost 基于每个搜索的“hardcoded.
”输入我给定的 -
您能否编辑问题,使其包含您的代码示例、您当前获得的内容以及您希望输出的理想内容?
-
添加代码示例
-
看起来您应该能够将自己的字段添加到“订单”子句中,以便您可以优先考虑“编码结果”?我以前没有使用过 SearchKick,但看起来应该可以使用
-
太棒了我不知道为什么我没有想到使用订单,但是我需要按分数进行二级订单还是会发生?
标签: ruby-on-rails ruby elasticsearch searchkick