pg_search:如何确定单词匹配的优先顺序?

时间:2014-06-01 13:06:32

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

探索:搜索多次出现类似于搜索查询的文字时,他们的排名会高于一次完全匹配的文字。

示例:说搜索查询“生产力”,然后“有机产品的生产”的排名高于“人工”生产力“只是因为它包含两个相似的单词,但没有确切的单词匹配。

问题:确定具有完全匹配的记录的优先顺序的最佳方法是什么?

这是我的pg_scope:

  pg_search_scope :search,
                  :against => {
                    :title => 'A',
                    :search_string => 'B'
                  },
                  :using => {
                    :tsearch => {
                      :dictionary => 'english',
                      :any_word => 'true'
                    }
                  }

THX。

1 个答案:

答案 0 :(得分:0)

如果您可以操纵搜索查询,请浏览cover density ranking (ts_rank_cd() instead of ts_rank()) and its normalization parameter

SELECT v, ts_rank(to_tsvector('english', v), to_tsquery('english', 'productivity')) rank,
       ts_rank_cd(to_tsvector('english', v), to_tsquery('english', 'productivity')) rankcd,
       ts_rank_cd(to_tsvector('english', v), to_tsquery('english', 'productivity'), 4) rankcd4,
       ts_rank_cd(to_tsvector('english', v), to_tsquery('english', 'productivity'), 6) rankcd6
FROM (
  VALUES ('production of organic products'::TEXT),
         ('labour productivity'),
         ('labour productivity with more unrelated words'),
         ('labour productivity with more unrelated words and again production'),
         ('production of productivity'),
         ('product production')
) d(v)

SQLFiddle

但是,我不确定如何使用自定义pg_search_scope设置normalization

或者,您可能对trigram searches感兴趣,它们提供更准确(逐个字符)的结果。