![](/img/trans.png)
[英]Search in belongs_to association in RoR, ElasticSearch with Searchkick
[英]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.