2

Rails アプリケーションに実装しようとしてpg_searchいますが、検索クエリに一致する列を取得する方法はあるのでしょうか? インデックス テーブルのコンテンツは、検索可能なすべての列フィールドで構成されます。

例えば:

+-----------+----------+
| Firstname | Lastname |
+-----------+----------+
| John      | Doe      |
| Jane      | Doe      |
+-----------+----------+

結果は次のとおりです。

+----------+
| Content  |
+----------+
| John Doe |
| Jane Doe |
+----------+

そして今、自分の検索クエリがファーストネームとラストネームのどちらに一致するかわかりません。pg_search列のタイトルをコンテンツ列にも追加するように指示するオプションはありますか? 何かのようなもの:

+------------------------------------------+
|                 Content                  |
+------------------------------------------+
| {"firstname": "John", "Lastname": "Doe"} |
| {"firstname": "Jane", "Lastname": "Doe"} |
+------------------------------------------+

または、私のニーズに合った検索の代替手段はありますか? pg_search特に私のマルチテナント/ポストグルスキーマアーキテクチャのために、非常にうまく機能します。

4

1 に答える 1

0

ネストされた解決策は、おそらく、一致した行の各列に対してオンザフライで tsvectors+query を生成することです..

例:

select *,
(to_tsvector(p.first_name)@@ to_tsquery( 'joe:*' )) found_in_first_name,
(to_tsvector(p.last_name)@@ to_tsquery( 'joe:*' )) found_in_last_name
from people p 
where  p.fts @@ to_tsquery( 'joe:*' );

各結果セットで返されるデータの量によっては、この例が最適なソリューションとなる可能性があります。

別の方法は、「重み」をハックして、必要なものを取得することです。

UPDATE people SET fts =
    setweight(to_tsvector(coalesce(firstname,'')), 'A')    ||
    setweight(to_tsvector(coalesce(lastname,'')), 'B');

SO、私たちが行ったのは、tsvector で firstname 列に「A」の「重み」を与え、「lastname」列に「B」の「重み」を与えることでした。「A」、「B」、「C」、および「D」のみが有効な重みであるため、5 つ以上の列でこれを行う必要がある場合は機能しないことに注意してください。

クエリは、必要に応じて特定の重みを照会できます。重みは tsvector のテキスト表現で表示されますが、検索時には使用できません (つまり、検索語が見つかった重みを返します)。

于 2015-01-09T08:01:31.667 に答える