5

私はブラジルのポルトガル語で簡単な記事のウェブサイトを開発しています。検索機能は全文検索に基づいていますが、期待どおりの結果が返されません。

私はpostgresqlでこれを作りました。簡略化した表は次のとおりです。

Artigos
-id
-title -- article title
-intro -- article introduction
-content -- article body
-publishdate -- date of launch
-artigosts -- this will work as our fts index.

テーブルを作成した後、次のコマンドを実行しました。

UPDATE artigos SET artigosts = 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(title,'')), 'A') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(intro,'')), 'B') ||
setweight(to_tsvector('pg_catalog.portuguese', coalesce(content,'')), 'C');

CREATE INDEX artigosts_idx ON artigos USING gist (artigosts);

CREATE TRIGGER artigosts_tg 
BEFORE INSERT OR UPDATE ON artigos 
FOR EACH ROW EXECUTE PROCEDURE 
  tsvector_update_trigger('artigosts', 'pg_catalog.portuguese', 'title', 'intro', 'content');

はい、検索には単純な重み付けを使用するつもりです。高速化するためのインデックス、トリガーを作成したので、インデックスの再作成などを気にせずに挿入および更新できます。

まあ、私の理解によれば、それはすべて問題ありません。しかし、結果はそうではありません。簡単な例。

1つの記事のコンテンツとして「... bancode dados ... nobanco...」があるとします。私がする時:

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts;

空のセットを返します。ts_vector列を確認し、述語「banc」と「dad」を確認しました。しかし、なぜそれが言及された記事を含む行を返さないのか理解できません。

誰かがこの質問に光を当てることができますか?

4

2 に答える 2

5

これはおそらく、デフォルトの辞書が英語に設定されているためです。次のクエリを試して、それが実際に当てはまるかどうかを判断してください。

SELECT * FROM ts_debug('banco de dados');

このクエリは、辞書が検索フレーズをどのように解析するかを示します。語彙素「banco」、「de」、および「dado」を提供する必要があります。したがって、実際に検索しているものはインデックスに存在せず、0件の結果を受け取ります。

今これを試してみてください:

SELECT * FROM ts_debug('portuguese', 'banco de dados');

インデックス「banc」と「dad」に存在する語彙素を返す必要があります。その場合は、検索クエリを変更するだけで適切な結果を得ることができます。

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('portuguese', 'banco de dados') @@ artigosts;
于 2010-10-18T15:25:29.917 に答える
1

おそらくあなたのために遅れるでしょう。そして、私は簡単なコメントを追加するのに十分な評判がありません...

特殊文字に関しては、tsvectorに変換する前にアクセントを外します。

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ'))

だから私は得る:

"'aeoiucao':4 'banco':1 'dados':3 'de':2"

必要がある:

CREATE EXTENSION unaccent;

...ユーザーpostgresとして。そして確かに、あなたはあなたのtsqueryもアクセントを外さなければなりません

于 2014-12-10T12:43:49.970 に答える