1

在遵循 Searchkick 自述文件和一些示例之后,我尝试实现一个涉及 belongs_to 关联的相当简单的搜索。不过,我没有看到我希望的行为,我希望我只是错过了一些小东西......

我有一个属于作者的图书模型。我想启用对书名或作者姓名的搜索。因此,例如,如果我要搜索“Stone”,我会同时看到“Stone Phillips”(作者)和“A Stone's Throw”(书籍)。此外,如果我将搜索修改为“Stone meadow”,它将返回 Stone Phillips 作为作者以及他的书名为“我的草地”。

我找到了解决第一个示例的方法,但我无法让第二个示例工作。目前,我有一个简单的 pg_search 可以轻松地执行上述两个示例,使用“关联_反对”方法。虽然我认为 Searchkick 提供了这么简单的东西,但我似乎无法让它工作......

我尝试过的主要方法:

在我的控制器中

@search = Book.search params[:query],
      limit: 30,
      fields: [:book_name, :author_name], 
      misspellings: false

在我的模型中(首先只是“search_data”方法;后来添加了范围......)

scope :search_import, -> { includes(:author) } 
  
  def search_data
    {
      book_name: book_name,
      author_name: author(&:author_name)
    }
  end

由于某种原因,这种方法不会返回任何关于作者姓名的结果。当我使用一个词搜索时,我只看到相关的书名——而且我没有看到多个词搜索的任何结果。

我还尝试将其切换为通过 Author 模型运行,这似乎效果更好,因为我得到了书籍和作者的结果。但是,我也得到了很多不相关的垃圾结果。而且,我仍然只看到一个词搜索的结果——两个词搜索没有结果。

我还尝试将多个模型索引添加到我的控制器代码中:

@search = Book.search params[:query],
      limit: 30,
      index_name: [Book.searchkick_index.name, Author.searchkick_index.name],
      fields: [:book_name, :author_name], 
      misspellings: false

这实际上为一个单词提供了最好的结果集。它返回所有预期的书名和作者姓名,没有所有垃圾。但是当我尝试添加第二个词来缩小搜索范围时,我没有得到任何结果......

我已经尝试了一些其他小的更改,使用来自其他帖子、tutos 等的建议。而且,如果有人想知道,我总是在更改 search_data 或 searchkick 方法后重新索引。

我希望我已经提供了足够的信息,但是如果您有任何问题,请告诉我......我似乎无法弄清楚我在逃避什么。任何帮助深表感谢!

4

1 回答 1

0

以下是我们如何在系统中实现类似的东西(注意这是一个精简的提取,因此可能存在一些小的语法问题,但应该了解一般要点):

class Product
  searchkick word_middle: [:title, :authors]

  def search_data
    {
      title: title,
      authors: authors.map(&:full_name).join('')
    }
  end

  def search_by_title_or_author(term, opts = {})
    search_opts = default_search_opts.merge(opts)
    search term, search_opts.merge(
      operator: 'or',
      fields: [
        [ { 'title^10': :word_middle }, { 'authors': :word_middle } ]
      ]
    )
  end

  protected

  def default_search_opts
    {
      per_page: 10,
      load: false  # we use caching, so don't load from DB by default,
      # we have other defaults as well that we include here
    }
end

根据我们的经验,这对我们来说效果最好,但您的需求可能需要一些调整。我们还将标题匹配权重放在更高的权重,因此如果您愿意,可以省略该提升。

于 2015-08-13T19:56:51.347 回答