繁体   English   中英

Searchkick gem和belongs_to关联

[英]Searchkick gem and belongs_to association

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

我有一个属于author_to作者的Book模型。 我想启用对书名或作者名的搜索。 因此,例如,如果我要搜索“ Stone”,我会同时看到“ Stone Phillips”(作者)和“ A Stone's Throw”(书)。 此外,如果我将搜索范围修改为“石草甸”,它将返回斯通·菲利普斯(Stone Phillips)作为作者以及他的书《我的草甸》。

我找到了解决第一个示例的方法,但是我无法使第二个示例正常工作。 当前,我有一个简单的pg_search,它使用“ associated_against”方法轻松地执行了以上两个示例。 尽管我认为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模型运行,因为我同时获得了书籍和作者的结果,所以看起来效果更好。 但是,我也得到了很多无关的垃圾结果。 而且,我仍然只看到一个单词搜索的结果-没有两个单词搜索的结果。

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

 @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方法进行更改后,我总是会重新编制索引。

我希望我已经提供了足够的信息,但是如果您有任何疑问,请告诉我...。我似乎无法弄清是什么使我难以理解。 任何帮助深表感谢!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM