3

ハッシュタグを利用して投稿にタグを付けるアプリがあります。より詳細な検索をしようとしています。

私が検索しているレコードの1つは次のとおりです。

The #bird flew very far.

「flew」、「fle」、または「#bird」を検索すると、レコードが返されるはずです。

ただし、「#bir」を検索すると、検索対象のタグ全体が一致しないため、文が返されません。

また、「鳥」が文を返す必要があるかどうかもわかりません。でもそれをどうやってやるのか興味があります。

今、私は非常に基本的な検索をしています:

SELECT "posts".* FROM "posts" WHERE (body LIKE '%search%')

何か案は?

4

2 に答える 2

3

LIKEを使用してこれを行うこともできますが、それはかなり恐ろしいことです。正規表現はここでより適切に機能します。ハッシュを無視したい場合は、次のような単純な検索でうまくいきます。

WHERE body ~ E'\\mbird\M''

それは見つけ'The bird flew very far.'て、'The #bird flew very far.'#ただし、次のように、検索する前にすべてを削除する必要があります。

WHERE body ~ E'\\m#bird\M''

\m\Mの性質上、これらの結果はどちらも見つかりません。

#のを無視したくない場合は、次のように自分で展開してショートカットbodyを変更する必要があります。\m\M

WHERE body ~ E'(^|[^\\w#])#bird($|[^\\w#])'
--   search term goes here^^^^^

を使用E'(^|[^\\w#])#bird($|[^\\w#])'すると、検索されますが検索さ'The #bird flew very far.'れませんが'The bird flew very far.'E'(^|[^\\w#])bird($|[^\\w#])'検索されますが、検索さ'The bird flew very far.'れません'The #bird flew very far.'微妙な違いがあるので、\A代わりに、^そして\Z代わりに見たいと思うかもしれませんが、私はあなたが望むものだと思います。$$^

これらの正規表現検索(またはそのことについてはLIKE検索)はいずれもインデックスを使用しないため、を使用するものを使用して検索を制限できない限り、多くのテーブルスキャンとパフォーマンスの問題に備えることに注意してください。索引。代わりに、全文検索ソリューションを検討することをお勧めします。

于 2012-10-11T22:43:19.960 に答える
3

テキストからハッシュタグを解析し、記事が挿入/更新されたときにハッシュタグと呼ばれる別の列の配列に格納すると役立つ場合があります。body記事にフィードする前に記事からそれらを削除し、テーブルの列にto_tsvector保存します。tsvector次に、以下を使用します。

WHERE body_tsvector @@ to_tsquery('search') OR 'search' IN hashtags

テーブルでトリガーを使用して、hashtags列とbody_tsvectorハッシュタグの削除を維持し、アプリケーションが作業を行う必要がないようにすることができます。エントリがINSERT編集されたとき、またはUPDATEdのときに、テキストからそれらを解析します。

于 2012-10-14T05:06:47.170 に答える