为什么在针对一个字段与多个字段进行范围界定时,rails pg-search 会得到不同的结果
Why am I getting different results from rails pg-search when scoping against one vs multiple fields
这是我的代码的摘录:
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 和 results: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 条记录,而针对所有允许字段的第二次搜索仅 returns 4 条记录。我不是 PostgreSQL 专家,但在我看来两者应该 return 相同的记录数。
此外,'fuzzy_search' 中使用了 proc,否则 'searchable_fields' 方法会产生错误。这是一个已知问题:open issue
直接回答你的问题:
第一个查询返回更多结果,因为它不同。
更具体地说:查询不太严格。
既然您可以看到 SQL,您应该查看相似性和合并函数以了解它们的作用。
这是我的代码的摘录:
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 和 results: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 条记录,而针对所有允许字段的第二次搜索仅 returns 4 条记录。我不是 PostgreSQL 专家,但在我看来两者应该 return 相同的记录数。
此外,'fuzzy_search' 中使用了 proc,否则 'searchable_fields' 方法会产生错误。这是一个已知问题:open issue
直接回答你的问题:
第一个查询返回更多结果,因为它不同。
更具体地说:查询不太严格。
既然您可以看到 SQL,您应该查看相似性和合并函数以了解它们的作用。