为什么在对一个vs多个字段进行作用时,我会从rails pg-search获得不同的结果

时间:2015-03-05 17:45:32

标签: ruby-on-rails ruby postgresql pg-search

以下是我的代码的摘录:

  pg_search_scope :dynamic_fuzzy_search, -> (field, qry){
    raise ArgumentError unless searchable_fields.include?(field)
    {
      :against => field,
      :query => qry,
      :using => {:trigram => {:threshold => 0.05}}
    }
  }

  pg_search_scope :fuzzy_search, -> (qry){
    raise ArgumentError unless true
    {
      :against => searchable_fields,
      :query => qry,
      :using => {:trigram => {:treshold => 0.05}}
    }
  }

这是从代码生成的SQL和结果:2.0.0-p353:073>

> MetaData.dynamic_fuzzy_search(:species,'rat').size
   (2.0ms)  SELECT COUNT(*) FROM "meta_data" WHERE ((similarity((coalesce("meta_data"."species"::text, '')), 'rat') >= 0.05))
 => 1170 
> MetaData.fuzzy_search('rat').size
   (7.9ms)  SELECT COUNT(*) FROM "meta_data" WHERE (((coalesce("meta_data"."experiment"::text, '') || ' ' || coalesce("meta_data"."species"::text, '') || ' ' || coalesce("meta_data"."strain"::text, '') || ' ' || coalesce("meta_data"."sex"::text, '') || ' ' || coalesce("meta_data"."diet"::text, '') || ' ' || coalesce("meta_data"."previous_diet"::text, '') || ' ' || coalesce("meta_data"."surgeon"::text, '') || ' ' || coalesce("meta_data"."pharm_treatment"::text, '')) % 'rat'))
 => 4 

如您所见,针对单个字段的第一个搜索范围生成1170条记录,而针对所有允许字段范围的第二个搜索仅返回4条记录。我不是PostgreSQL专家,但在我看来,两者应该返回相同数量的记录。

此外,proc用于'fuzzy_search',否则'searchable_fields'方法会产生错误。这是一个已知问题:open issue

1 个答案:

答案 0 :(得分:1)

直接回答您的问题:

第一个查询返回更多结果,因为它不同。

更具体一点:查询不太严格。

由于您可以看到SQL,因此您应该查看相似性和合并函数以查看它们的作用。