2016-08-09 4 views
1

使い方ts_debug私はPostgresが(私が何を呼んでいるのか) "単語の区切り"として何の記号を扱うのか分かります。PostgreSQL全文検索:「単語区切り」として分類されるものを変更するにはどうすればよいですか?

例:

SELECT ts_debug('english', 'Hello. ABC') 

結果:

(asciiword,"Word, all ASCII",Hello,{english_stem},english_stem,{hello}) 
(blank,"Space symbols",". ",{},,) 
(asciiword,"Word, all ASCII",ABC,{english_stem},english_stem,{abc}) 

.(ドット領域)がワードセパレータとして扱われます。 私の問題は、単一のドット.を単語区切り文字として扱うにはPostgresが必要です。

現在、ABCを検索した場合、内容がHello.ABC(ドットの後ろにスペースはありません)のエントリが見つかりません。Hello. ABCのみが見つかります。

私はこの検索クエリを使用しています:IOExceptionを検索すると、単語の区切りとして(スペースなし)単一のドットを治療する方法はありjava.io.IOException

見つけることができません。

SELECT description FROM incident WHERE 
    to_tsvector('english', description) @@ to_tsquery('english', 'ABC') 

別の例

答えて

2

問題は、パーサーがホスト名としてHello.ABCを認識することです。

SELECT alias, description, token, lexemes FROM ts_debug('english', 'Hello.ABC'); 
┌───────┬─────────────┬───────────┬─────────────┐ 
│ alias │ description │ token │ lexemes │ 
├───────┼─────────────┼───────────┼─────────────┤ 
│ host │ Host  │ Hello.ABC │ {hello.abc} │ 
└───────┴─────────────┴───────────┴─────────────┘ 
(1 row) 

あなたはそれを避けるために、パーサーを変更したり、新しいものを作成する必要があるだろうが、それが唯一のC.で行うことができます

私がお勧めしたいの回避策は、すべてのドットを交換することで、処理の前に空白をスラッシュ:

SELECT to_tsvector('english', 
      translate('Hello/ABC', '/.', ' ', 'g') 
     ) @@ to_tsquery('english', 
      translate('ABC', '/.', ' ', 'g') 
     ) AS match; 
┌───────┐ 
│ match │ 
├───────┤ 
│ t  │ 
└───────┘ 
(1 row) 
+0

PostgresのFTSを設定するには、そんなに選択肢がありますが、私は私がちゃんと考えていましたこれは簡単です。しかし、あなたの提案された回避策は私の場合には問題ありません。ありがとう! – Leif

+2

@Leif:正規表現は高価です。 'translate( 'Hello/ABC'、 '/。'、 '')'(2 space char!)が高速です。 –

+1

真。私は答えを更新しました。 –

関連する問題