0

私の問題は、PL / pgSQLパーサーが「#」や「+」などの記号をスペース記号として扱うため(これは問題ありません)、「C ++」、「C#」、「PL/SQL」などのクエリは次のように解析されることです。

 asciiword | Word, all ASCII | C     | {english_stem}        | english_stem | {c}
 blank     | Space symbols   | #     | {thesaurus_en,simple} | simple       | {#}

私はこの種のクエリを処理するための最良の方法を見つけようとしています。私はシソーラス辞書を使ってそれを達成しようと試みてきましたが、おそらくうまくいくようには見えません。

私が考えているのは、データベースへの書き込み中に「C#」を「CSHARP」に書き直すもの(「C#」は「C」としてインデックス付けされると思うので)と、検索中に同じことを行うものです。

私はおそらく私のWebアプリケーション側でそれを行うことができましたが、それは正しくないようです。

それをどのように処理するか、または考えているアプローチにどのPL / pgSQLトリガーを使用できるでしょうか?

4

2 に答える 2

1

さて、あなたはあなた自身のパーサーを(Cで)書くことができました、しかしそれはおそらくあなたが行きたかったより多くの努力です。

あなたは次のようなことをすることができます:

to_tsvector('english', my_transformer(document_text)) 
...
to_tsquery('english', my_transformer(query_text))

実際のリテラルドキュメントテキストを変換する必要はなく、tsvectorインデックスとクエリだけを変換する必要があります。これはインデックス定義でも実行できます(ただし、my_transformerは不変関数である必要があります)。

問題は、着信テキストを変換するための最も簡単で最も効率的な方法が何であるかということです。すでにplperl/pltclを使用している場合は、おそらくいくつかの巧妙な正規表現の置換を行うことができます。そうでない場合は、plpgsqlまたはplsqlでいくつかのより単純な正規表現の置換を試してください。ただし、この種のものには常に厄介なコーナーケースがあるため、交換品を徹底的にテストするようにしてください。

于 2012-04-21T15:30:02.880 に答える
1

(OPに代わって投稿されました。)

今後の参考のために、ここにtsearchパーサーの作成に関する優れたガイドがあります:http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/HOWTO-parser-tsearch2.html

とにかく、リチャードによって提案された解決策はうまく機能し、はるかに少ない労力で済みます。

于 2015-06-16T17:43:04.773 に答える