我有一个演出者模型
def search_data
{
name: name,
description: description
}
end
我创建了两个艺术家
Artist.create(name: "Da Vinci", description: "Tortuga")
Artist.create(name: "Donatello", description: "Tortoise")
然后重新索引它们
Artist.reindex
进行常规搜索
Artist.search("*").results
返回
=> [#<Artist id: 295, name: "Donatello", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:21", updated_at: "2018-10-25 13:43:21">, #<Artist id: 296, name: "Da Vinci", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:52", updated_at: "2018-10-25 13:43:52">]
所以我得出结论,艺术家正确编入索引 我进行搜索
Artist.search("D").results
但它只会返回
=> [#<Artist id: 296, name: "Da Vinci", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:52", updated_at: "2018-10-25 13:43:52">]
从字面上看,无需搜索“ *”即可到达Donatello的唯一方法是
Artist.search("Donatello").results
返回
=> [#<Artist id: 295, name: "Donatello", description: "Tortuga", avatar: nil, cover: nil, created_at: "2018-10-25 13:43:21", updated_at: "2018-10-25 13:43:21">]
我想念什么?预先感谢。
-UDAPTE-
我想从字面上进行此查询
search("*", page: page, per_page: per_page, where: { _or: [ { name: /.*#{query}.*/ }, { description: /.*#{query}.*/ } ] })
答案 0 :(得分:1)
看看:
默认情况下,结果必须与查询中的所有单词匹配。
ruby
Product.search "fresh honey" # fresh AND honey
要更改此设置,请使用:
ruby
Product.search "fresh honey", operator: "or" # fresh OR honey
默认情况下,结果必须匹配整个单词-back
将不匹配backpack
。您可以使用以下方式更改此行为:
ruby
class Product < ApplicationRecord
searchkick word_start: [:name]
end
要搜索(重新索引后):
ruby
Product.search "back", fields: [:name], match: :word_start
可用的选项是:
选项|火柴例
--- | --- | ---
:word
|整个词| apple
与apple
相匹配
:word_start
|词的开头| app
与apple
相匹配
:word_middle
|单词的任何部分| ppl
与apple
相匹配
:word_end
|字尾| ple
与apple
相匹配
:text_start
|文字开头| gre
匹配green apple
,app
不匹配
:text_middle
|文字的任何部分| een app
与green apple
相匹配
:text_end
|文字结尾| ple
匹配green apple
,een
不匹配
默认值为:word
。最多的匹配将发生在:word_middle
上。
答案 1 :(得分:0)
有一个正确但不完整的答案。 解决方案是使用部分匹配,在我的情况下是匹配::text_middle
缺少的是,我不得不更改模型以使用text_middle
searchkick callbacks: :async, text_middle: [:name, :description]
和搜索查询
Artist.search("D", match: :text_middle).results