1

ハッシュタグを含む「exclude」というテーブルがあります。

-------------
id | tag
-------------
1    #oxford
2    #uk
3    #england
-------------

'post'という別のテーブルがあります。

-----------------------------------------------
id | tags               | text
1    #oxford #funtimes    Sitting in the sun
2    #oz                  Beach fun
3    #england             Milk was a bad choice
-----------------------------------------------

投稿タグでテキスト検索を行うために、次のようなクエリを実行しました。

SELECT * FROM post WHERE to_tsvector(tags) @@ plainto_tsquery('mysearchterm')

ただし、タグの一部またはすべてが除外テーブルにあるすべての投稿を除外できるようにしたいと思います。SQL / Postgresでこれを行う簡単な方法はありますか?

タグの行を1つの列に変換し、plainto_tsquery関数内でこの用語を使用しようとしましたが、機能しません(どちらにも等しくないテキスト検索を行う方法がわからないため、ロジックが実際には間違っています。私の頭の中では正しい線にありますが):

select * from post where to_tsvector(tags) @@ plainto_tsquery(
   select array_to_string(array(select RTRIM(value) from exclude where key = 'tag'), ' ')
)
4

1 に答える 1

1

どのバージョンのPostgreSQLを使用していますか?また、スキーマ設計はどの程度柔軟ですか?つまり、自由に変更できますか?それとも、これはあなたのコントロールの外にありますか?

私があなたの質問を読んだとき、2つのことがすぐに頭に浮かびました。1つは、配列と@>(含む)または<@(含む)演算子を使用できる必要があることです。

ここにドキュメントがあります

次に、hstoreを利用して、同様の操作を実行できる場合があります。に:

hstore @> hstore

実際のキー=>値のペアを使用していないため、これは実際のhstoreではありません。ただし、{tagname}=Trueまたは{tagname}=NULLを実行できると思います。少しハックかもしれません。

ドキュメント(PostgreSQL 9.1の場合)hstoreとその使用方法はここで確認できます。

于 2012-09-27T04:07:16.713 に答える