2014-08-28 142 views
6

我有15000个课程,我想提高每个班级的头衔,所以如果一个班级的精确匹配比其他任何事物都更好。Searchkick提高精确匹配

当我做Course.seach_kick('感兴趣的理论',1) 正确的搜索与'感兴趣的理论'作为第一个结果返回。

但是,当我做Course.search_kick('interest of theory of 3618',1)
3618是catalog_number时,将不返回任何结果。我期望返回利息理论,并首先返回。看起来搜索正在寻找完整的字符串“兴趣理论3618”被包含在课程的标题中。

我明白'和'是默认的操作符,是否需要使用'或'操作符?由于意想不到的结果,我对使用'或'运算符犹豫不决。

谢谢,我真的很喜欢使用宝石。

搜索方法:

def self.search_kick(query, page) 
    search(query, 
     fields: ["title^10", "description", "crse_id", "subject", "catalog_number" ], 
     facets: [:subject], 
     misspellings: false, 
     page: page, 
     per_page: 20 
     ) 
end 

def search_data 
    { 
    title: title, 
    description: description, 
    crse_id: crse_id, 
    subject: subject, 
    catalog_number: catalog_nbr 
    } 
end 
+0

你有没有解决过这个问题? – Kathan 2015-07-18 22:43:08

+1

@Kathan与搜索踢宝石不同,我最终不得不使用搜索踢宝石完全弹性搜索。 – srm 2015-07-20 18:03:34

回答

2

为什么不能过滤在where子句catalog_number:

search(query, 
    fields: ["title^10", "description", "crse_id", "subject" ], 
    facets: [:subject], 
    misspellings: false, 
    where: {catalog_number: 3618}, 
    page: page, 
    per_page: 20 
    ) 

在大多数情况下,where子句来自一个IF:

conditions = {} 
if params[:catalog_number].present? 
    conditions[:catalog_number] = params[:catalog_number].to_i 
end 
search(query, 
    fields: ["title^10", "description", "crse_id", "subject" ], 
    facets: [:subject], 
    misspellings: false, 
    where: conditions, 
    page: page, 
    per_page: 20 
    ) 

可以插入尽可能多的过滤到where子句中,就像ActiveRecord.where()一样()

docs ref:https://github.com/ankane/searchkick#queries