首页 > 解决方案 > 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">]

我可以在不搜索“*”的情况下到达多纳泰罗的唯一方法是字面上

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">]

我错过了什么?提前致谢。

-- 达普特 --

我想从字面上做这个查询

search("*", page: page, per_page: per_page, where: { _or: [ { name: /.*#{query}.*/ }, { description: /.*#{query}.*/ } ] })

标签: searchkick

解决方案


看一眼:

部分匹配

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

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 appleapp不匹配 :text_middle| 文本的任何部分 | een app比赛green apple :text_end| 正文结束 | ple匹配green appleeen不匹配

默认值为:word. 大多数匹配将发生在:word_middle.


推荐阅读