首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件:如何搜索多个单词的查询?

文件:如何搜索多个单词的查询?
EN

Stack Overflow用户
提问于 2018-05-23 12:18:06
回答 1查看 501关注 0票数 0

我用filterrific做过滤器。

假设我得到一个locality设置为"New“的对象。

使用当前的代码,如果我只搜索一个单词(例如:"New“),它就能工作。如果我写“纽约”,什么都不会出现。

美极了示例中,过滤器允许用户在“查询”中写几个单词。

模型

代码语言:javascript
复制
  scope :search_query, lambda { |query|
  return nil  if query.blank?
    terms = query.downcase.split(/\s+/)
    terms = terms.map { |e|
      (e.gsub('*', '%') + '%').gsub(/%+/, '%')
    }
    num_or_conds = 2
    where(
      terms.map { |term|
        "(LOWER(title) LIKE ? OR LOWER(locality) LIKE ?)"
      }.join(' AND '),
      *terms.map { |e| [e] * num_or_conds }.flatten
    )
  }



filterrific(
   default_filter_params: {},
   available_filters: [
     :search_query
   ]
 )

控制器

代码语言:javascript
复制
def index
   @filterrific = initialize_filterrific(
     @ads,
     params[:filterrific]
   ) or return
    @ads = @filterrific.find.page(params[:page])
end

视图

代码语言:javascript
复制
  = form_for_filterrific @filterrific do |f|
    div
      | Search
      = f.text_field :search_query, class: 'skills field w-input filterrific-periodically-observed', placeholder: "Job title, keywords, skills..."

      = f.submit 'GO !', {class: "submit-b w-button"}

编辑

日志

代码语言:javascript
复制
 Ad Load (1.2ms)  SELECT  "ads".* FROM "ads" WHERE (publishing_at <= '2018-05-24') AND (expiring_at >= '2018-05-24') AND ((LOWER(title) LIKE 'new%' OR LOWER(locality) LIKE 'new%') AND (LOWER(title) LIKE 'york%' OR LOWER(locality) LIKE 'york%')) LIMIT $1 OFFSET $2  [["LIMIT", 20], ["OFFSET", 0]]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-24 12:37:59

从SQL日志可以看出这个问题:

代码语言:javascript
复制
...
AND ((LOWER(title) LIKE 'new%' OR LOWER(locality) LIKE 'new%')
AND (LOWER(title) LIKE 'york%' OR LOWER(locality) LIKE 'york%'))

所需的SQL 应该是

代码语言:javascript
复制
...
AND ((LOWER(title) LIKE '%new%' OR LOWER(locality) LIKE '%new%')
AND (LOWER(title) LIKE '%york%' OR LOWER(locality) LIKE '%york%'))

因为"new“在locality的开头,所以它匹配;但是因为"york”不在开头,所以它不匹配。

要解决这个问题,您可以替换行:

代码语言:javascript
复制
(e.gsub('*', '%') + '%').gsub(/%+/, '%')

通过以下方式:

代码语言:javascript
复制
('%' + e.gsub('*', '%') + '%').gsub(/%+/, '%')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50488221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档