【问题标题】:Searchkick gem and belongs_to associationSearchkick gem 和 belongs_to 关联
【发布时间】:2015-11-06 22:14:12
【问题描述】:

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

我有一个属于 Author 的 Book 模型。我想启用对书名或作者姓名的搜索。因此,例如,如果我要搜索“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

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

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

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

@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 方法后重新索引。

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

【问题讨论】:

    标签: ruby-on-rails searchkick


    【解决方案1】:

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

    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
    

    根据我们的经验,这对我们来说效果最好,但您的需求可能需要进行一些调整。我们还会对标题匹配进行更高的加权,因此您可以根据需要省略这种提升。

    【讨论】:

    • 谢谢伊恩!您的加入方法和“或”运算符似乎有帮助。当我使用这些并使我的作者模型成为搜索的模型时,我可以搜索多个单词。但是,我得到了很多垃圾/额外的结果。然而,当我将 Book 模型设置为搜索模型并尝试重新索引时,我收到一条错误消息,提示“NoMethodError: undefined method `join' for #<0x007fbcda144878>
    猜你喜欢
    • 2015-09-11
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多