【问题标题】:controlling search results position SearchKick控制搜索结果位置 SearchKick
【发布时间】: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


【解决方案1】:

所以经过一些非常有用的 cmets 和更多搜索后,我找到了解决方案。 首先,我的第一个错误是尝试使用 boosts 而不是 order 来修复它,为此我们在一个名为 query_results 的字段下索引特定产品的所有 QueryResults。 对于带有查询结果的产品 x:

{
  query: 'foo',
  wanted_rank: 1,
},
{
  query: 'bar',
  wanted_rank: 2,
}

我会索引:

{
  name: 'x',
  query_results: {
    'foo': 1,
    'bar': 2
  }
}

比搜索时,给定一个名为查询的属性,我会做如下:

Product.search(
  query,
  order: [ 
    { "query_results.#{query}": { unmapped_type: :long },
    { _score: :desc } 
  ]
)

需要注意的两个重要事项:

  1. 使用 unmapped_type 这将告诉 Elastic 在没有映射时使用什么映射,每个没有查询结果的随机查询(其中大多数)将没有“query_results.#{query}”的映射,因为它不会被索引,因此我们添加 unmapped_type 来告诉 elastic,如果您没有像它的 long 那样的映射行为。
  2. 在搜索和保存 db 时,我将小写和剥离查询,以便正确匹配。

我还索引另一个字段下的查询,并以低权重对其进行搜索,以确保该产品会出现在该查询中。

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2016-05-12
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多