【问题标题】:Searchkick reindexing but search doesnt work unless full word is givenSearchkick 重新索引,但除非给出完整的单词,否则搜索不起作用
【发布时间】:2018-10-25 13:53:51
【问题描述】:

我有一个艺术家模型

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

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

-- UDAPTE--

我想从字面上做这个查询

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

【问题讨论】:

    标签: searchkick


    【解决方案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 |整个词| 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

    【讨论】:

      【解决方案2】:

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

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

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

      和搜索查询

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

      【讨论】:

        猜你喜欢
        • 2020-02-15
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 2016-05-30
        • 2020-03-02
        • 2012-10-13
        • 2014-11-02
        • 1970-01-01
        相关资源
        最近更新 更多