2

ファジー テキスト マッチングに postgreSQL を使い始めたところです。と の 2 つの列がjob_titleありcompany_nameます。

典型的な全文検索は、 と を連結job_titlecompany_name、単一のランキングに従って検索テキスト結果を返します。

ただし、私の場合、2 つの列でテキストの一致を同等に扱うことは問題になる可能性があります。たとえば、Search EngineeratはatGoogle Co.と同等にランク付けされるべきではありませんGoogle SearchEngineer Co.

各列に異なる重みを割り当てることができることを知っています。ただし、どちらかを重視する理由はありません。

キーワードを各列に対して個別に照合し、各キーワードの「一致スコア」を返すにはどうすればよいですか?

何かのようなもの:

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

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

1 に答える 1

2

ご指摘のとおり、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

あなたの場合、代わりに 2 つの別々のクエリを組み合わせたいようです。醜いがおそらく適切な解決策は次のようになります。

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

ご覧のとおり、あまりきれいではありません。また、一致する行の潜在的に大きなセットを集約するための大通りでもあります。Imho、組み込みの tsvector 演算を使い続け、必要に応じて重みを微調整したほうがよいでしょう。

于 2013-06-28T11:12:41.677 に答える