19

私はプロジェクトを支援するために参加し、数年間使用していなかった PostgreSQL に戻ってきました。使用の欠如は別として、私はこれまで tsvector フィールドを使用したことがなく、それらに基づくバグに直面していることに気づきました。フィールドの型とその目的に関するドキュメントを読みましたが、 to_tsquery() の最初のパラメーターとして「シンプル」と「英語」がどのように異なるかについてのドキュメントを掘り下げるのに苦労しています

> SELECT to_tsvector('mortgag') @@ to_tsquery('simple', 'mortgage')
?column? 
----------
 f
(1 row)

> SELECT to_tsvector('mortgag') @@ to_tsquery('english', 'mortgage')
?column? 
----------
 t
(1 row)

どちらも true を返す必要があると思いますが、明らかに最初のものはそうではありません-なぜですか?

4

1 に答える 1

30

FTSは、辞書を使用してテキストを正規化します。

12.6。辞書

辞書は、検索で考慮されるべきではない単語(ストップワード)を削除し、同じ単語の異なる派生形式が一致するように単語を正規化するために使用されます。正常に正規化された単語は、語彙素と呼ばれます。

そのため、辞書は、検索で考慮するにはあまりにも一般的または無意味なもの(ストップワード)を破棄し、他のすべてを正規化して、たとえば、都市都市が異なる単語であっても一致するようにするために使用されます。

ts_debugからの出力を見て、辞書で何が起こっているかを見てみましょう。

=> select * from ts_debug('english', 'mortgage');
   alias   |   description   |  token   |  dictionaries  |  dictionary  |  lexemes  
-----------+-----------------+----------+----------------+--------------+-----------
 asciiword | Word, all ASCII | mortgage | {english_stem} | english_stem | {mortgag}

=> select * from ts_debug('simple', 'mortgage');
   alias   |   description   |  token   | dictionaries | dictionary |  lexemes   
-----------+-----------------+----------+--------------+------------+------------
 asciiword | Word, all ASCII | mortgage | {simple}     | simple     | {mortgage}

は辞書を使用しているのに対し、は辞書をsimple使用していることに注意してください。simpleenglishenglish_stem

simple辞書:_

入力トークンを小文字に変換し、ストップワードのファイルと照合することで動作します。ファイル内で見つかった場合は、空の配列が返され、トークンが破棄されます。そうでない場合、単語の小文字の形式が正規化された語彙素として返されます。

辞書はsimpleストップワードや小文字を捨てるだけで、それだけです。私たちはその単純さを自分たちで見ることができます:

=> select to_tsquery('simple', 'Mortgage'), to_tsquery('simple', 'Mortgages');
 to_tsquery | to_tsquery  
------------+-------------
 'mortgage' | 'mortgages'

辞書は単純すぎて、simple単純な複数形を処理することさえできません。

では、このenglish_stem辞書とは何ですか?「語幹」接尾辞はプレゼントです。この辞書は、語幹アルゴリズムを単語に適用して、(たとえば)都市都市を同じものに変換します。細かいマニュアルから:

12.6.6。スノーボール辞書

Snowball辞書テンプレートは、人気のあるPorterの英語のステミングアルゴリズムの発明者であるMartinPorterによるプロジェクトに基づいています。[...]各アルゴリズムは、一般的な異体字の単語を、その言語内のベースまたはステムのスペルに減らす方法を理解しています。

そのすぐ下にenglish_stem辞書があります。

CREATE TEXT SEARCH DICTIONARY english_stem (
    TEMPLATE = snowball,
    Language = english,
    StopWords = english
);

したがって、english_stem辞書は単語の語幹であり、それが発生することがわかります。

=> select to_tsquery('english', 'Mortgage'), to_tsquery('english', 'Mortgages');
 to_tsquery | to_tsquery 
------------+------------
 'mortgag'  | 'mortgag'

エグゼクティブサマリー'simple'単純な文字通りのマッチングを意味し、'english'ステミングを適用して(うまくいけば)より良いマッチングを生成します。ステミングは住宅ローンを住宅ローンに変え、それはあなたにあなたのマッチを与えます。

于 2012-05-25T02:00:03.583 に答える