3

誰かが Oracle テキスト ( CTXSYS.CONTEXT) を使用した経験がある場合、ユーザーがアポストロフィを含む可能性のある名前を検索したい場合にユーザー入力を処理する方法を知りたいです。

' のエスケープは場合によっては機能するようですが、単語の末尾の 's では機能しません。s はストップ ワードのリストに含まれているため、削除されるようです。

現在、単純なクエリ テキスト (つまり、単なる文字) を%text%に変更しています。たとえば、次のようになります。

contains(field, :text) > 0

O'Neilの検索は機能しますが、Joe の検索は機能しません。

Oracle Text を使用してこの問題に対処した人はいますか?

4

3 に答える 3

2

すべての特殊文字をバックスラッシュでエスケープします。中括弧は完全なトークンを定義するため、部分文字列検索では機能しません。例: %{ello}% はトークン「Hello」と一致しません

エスケープされたスペース文字は検索トークンに含まれるため、検索文字列 '%stay\ near\ me%' はリテラル文字列 "stay near me" として扱われ、'near' 演算子は呼び出されません。

短い文字列(名前など)を索引付けしていて、Oracle Textがlike演算子とまったく同じように動作するようにする場合は、個々の単語のトークンを作成しない独自のレクサーを作成する必要があります。(残念ながら、CATSEARCH は部分文字列検索をサポートしていません...)

検索を変更して、トークン マッチングを使用して oracle テキストのセマンティクスを使用することはおそらく良い考えですが、一部のアプリケーションでは、複数の (短い) トークンと数値トークンのワイルドカード展開により、ユーザーが合理的に検索文字列に対してあまりにも多くのヒットが作成されます。動作することを期待します。

たとえば、「%I\ AM\ NUMBER\ 9%」の検索は、「I」で終わり「9」で始まるすべてのトークンを検索する必要があるため、索引付けされたデータに多数の数値トークンがある場合、ほとんどの場合失敗します。結果が返される前にマージされます。

「I」と「AM」はおそらくデフォルトのストップリストにもあり、完全に無視されるため、この架空のアプリケーションでは、これらのトークンが重要な場合は null ストップリストを使用できます。

于 2012-01-26T22:51:00.397 に答える
1

インデックス作成時に使用PARAMETERS('STOPLIST ctxsys.empty_stoplist')すると、すべてのアルファベット トークンがインデックスに含まれます。アクセント付きの文字も索引付けされています。アルファベット以外の文字は、通常、BASIC_LEXER によって空白として扱われます。

また、CONTEXT 文法では、WITHIN、NEAR、ABOUT などの記号や予約語を含む多くの演算子が使用されます。これらはすべて、入力で何らかの方法でエスケープする必要があります。部分文字列を検索する必要がある場合の正しいエスケープ方法は、すべての文字を でエスケープすること\です。これは、関連する質問への回答です: Oracle text escaping with curly brackets and wildcards . 用語全体 (名前など) を検索する必要がある場合は、より単純な{input}エスケープを使用できます。

于 2017-01-22T04:17:34.907 に答える
-2

消毒を忘れてください。なんで?http://en.wikipedia.org/wiki/SQL_injectionを参照してください。

使用しているデータベース インターフェイス API の種類によって異なります。Perl DBI、ODBC、JDBC は、パラメーター化されたクエリまたは準備済みステートメントをサポートします。ネイティブ DBI を使用していて、それがサポートされていない場合は、神のご加護がありますように。

于 2008-10-21T00:37:51.710 に答える