Searchkick重新编制索引,但是除非给出完整的单词,否则搜索将不起作用

时间:2018-10-25 13:53:51

标签: searchkick

我有一个演出者模型

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}.*/ } ] })

2 个答案:

答案 0 :(得分:1)

看看:

Partial Matches

默认情况下,结果必须与查询中的所有单词匹配。

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 |整个词| appleapple相匹配 :word_start |词的开头| appapple相匹配 :word_middle |单词的任何部分| pplapple相匹配 :word_end |字尾| pleapple相匹配 :text_start |文字开头| gre匹配green appleapp不匹配 :text_middle |文字的任何部分| een appgreen apple相匹配 :text_end |文字结尾| ple匹配green appleeen不匹配

默认值为:word。最多的匹配将发生在:word_middle上。

答案 1 :(得分:0)

有一个正确但不完整的答案。 解决方案是使用部分匹配,在我的情况下是匹配::text_middle

缺少的是,我不得不更改模型以使用text_middle

searchkick callbacks: :async, text_middle: [:name, :description]

和搜索查询

Artist.search("D", match: :text_middle).results