【问题标题】:Full text search in multiple columns with PostgreSQL使用 PostgreSQL 在多列中进行全文搜索
【发布时间】:2013-06-28 01:33:55
【问题描述】:

我刚开始使用 postgreSQL 进行模糊文本匹配。我有两列:job_titlecompany_name

典型的全文搜索会连接job_titlecompany_name,然后根据单个排名返回搜索文本结果。

但是,在我的情况下,同等对待两列中的文本匹配可能会出现问题。例如,Search Engineer Google Co. 不应与 Google Search Engineer Co. 排名相同

我知道我可以为每一列分配不同的权重。但是,我没有理由认为一个比另一个更重要。

如何将我的关键字分别与每一列进行匹配,并为每个关键字返回一些“匹配分数”?

类似:

Jobs.where("(to_tsvector('english', position) @@ plainto_tsquery(:q)) AND 

(to_tsvector('english',company) @@ plainto_tsquery(:q))", q: "Search Engineer", q: "Google")

【问题讨论】:

    标签: ruby-on-rails postgresql full-text-search


    【解决方案1】:

    正如您所指出的,您可以连接 tsvector:

    # select to_tsvector('job description') ||
             to_tsvector('company as keyword') ||
             to_tsvector('job description as body') as vector;
                              vector                           
    -----------------------------------------------------------
     'bodi':9 'compani':3 'descript':2,7 'job':1,6 'keyword':5
    (1 row)
    

    您还可以为它们分配权重:

    # select (setweight(to_tsvector('job description'), 'A') ||
             setweight(to_tsvector('company as keyword'), 'B') ||
             setweight(to_tsvector('job description as body'), 'D')) as vector;
                                vector                             
    ---------------------------------------------------------------
     'bodi':9 'compani':3B 'descript':2A,7 'job':1A,6 'keyword':5B
    (1 row)
    

    您也可以使用ts_rank_cd()。特别是,您可以更改分数归一化的方式。

    http://www.postgresql.org/docs/current/static/textsearch-controls.html

    在您的情况下,您似乎希望合并两个单独的查询。一个丑陋但可能足够的解决方案可能如下所示:

    select sum(rank) as rank, ...
    from (
       select ...
       union all
       select ...
       ) as sub
    group by ...
    order by sum(rank) desc
    limit 10
    

    如您所见,它不是很漂亮。它也是聚合潜在的大量匹配行的大道。恕我直言,如果需要,您最好坚持使用内置的 tsvector 算法并调整权重。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2013-03-31
      • 2023-04-04
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多