質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

2回答

951閲覧

Oradcle Txetの検索について

dddkogam2

総合スコア13

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2019/07/16 05:56

編集2019/07/16 09:19

前提・実現したいこと

Oracle Txetでの記号文字の検索

発生している問題・エラーメッセージ

検索対象としたい記号の例:!"#$%&()=~|@`[]<>?_

1)「A-1」、「A@1」、「A,1」、「A-----1」を検索文字とした場合、すべて同じ検索結果となります。
検索対象が「A{記号文字}1」として扱われていると思われます。

2)検索文字の文頭、文末に記号文字を指定した場合も記号文字は検索文字として扱われません。
「-A-1」や「A-1\」、「@-A-1/」を検索文字としても、「A{記号文字}1」として扱われます。

該当のソースコード

ソースコード

試したこと

補足情報(FW/ツールのバージョンなど)

ネットで色々調べたのですが、Oracle txetの仕様で記号文字は検索できないとの記載がありましたので、
記号文字をの文字として検索できないのは、仕様なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/07/16 06:36

現象を再現できるだけの情報、CREATE TABLE, 原稿データの INSERT で、SELECT 文を質問に追記されては?
sazi

2019/07/16 06:57

'{A-1}'などと指定しても駄目なのですか?
sazi

2019/07/16 07:05

それから、インデックスの定義および同期化を行っているかどうかを追記して下さい。
guest

回答2

0

ベストアンサー

以下参考。
Oracle Text問合せの特殊文字

後はストップワードが関連していないかですね。
4 Oracle Textでの問合せ

4.1.5 ストップワードの問合せ
ストップワードは、索引エントリが作成されないワードです。ストップワードは、通常、それ自体は検索の対象とならない、その言語の一般的なワードです。

Oracle Textには、使用言語のデフォルトのストップワード・リストが組み込まれています。このリストは、ストップリストと呼ばれます。たとえば、英語では、ワードthisおよびthatは、デフォルトのストップリストでストップワードとして定義されています。このデフォルトのストップリストを変更したり、CTX_DDLパッケージを使用して新しいストップリストを作成できます。また、索引を作成した後で、ALTER INDEX文でストップワードを追加することもできます。

ストップワードまたはストップワードのみで構成されている句に対する問合せは発行できません。たとえば、thisがストップワードとして定義されている場合は、ワードthisを問い合せても、ヒットは戻りません。

ただし、this boy talks to that girlのように、ストップワードとストップワード以外のワードが含まれている句を問い合せることはできます。これは、Oracle Textの索引では、ストップワードの索引エントリは作成しませんが、ストップワードの位置は記録しているためです。

問合せ句内にストップワードが含まれている場合、このストップワードは任意のワードに一致します。たとえば、次の問合せがあるとします。

'Jack was big'
ストップワードがwasの場合、Jack is bigおよびJack grew bigなどの句が一致します。grewはストップワードではありませんが、この問合せでは一致します。

そもそも記号だけの塊なら全文検索ではなく、コレクション型とかJSONとかの方が良さそうな気もしますが。

投稿2019/07/16 09:50

編集2019/07/16 09:59
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

BASIC_LEXER を使用し printjoin 属性に特殊文字を登録すると、トークンの一部として扱われるようです。

CREATE TABLE TESTTAB( TEXT VARCHAR2(1024) ) / INSERT INTO TESTTAB VALUES('A-1') / INSERT INTO TESTTAB VALUES('A@1') / INSERT INTO TESTTAB VALUES('A\1') / BEGIN ctx_ddl.create_preference('mylex', 'BASIC_LEXER'); ctx_ddl.set_attribute('mylex', 'printjoins', '_-\@'); END; / CREATE INDEX IX_TEXT ON TESTTAB(TEXT) INDEXTYPE IS ctxsys.context PARAMETERS('lexer mylex') / BEGIN ctx_ddl.sync_index('IX_TEXT'); END; /

そして、特殊文字の前に「\」をつけて検索します。

SELECT * FROM TESTTAB WHERE CONTAINS(TEXT, 'A-1') > 0
結果:
A-1

SELECT * FROM TESTTAB WHERE CONTAINS(TEXT, 'A@1') > 0
結果:
A@1

SELECT * FROM TESTTAB WHERE CONTAINS(TEXT, 'A\1') > 0
結果:
A\1

参考資料:
Oracle Text索引付けの要素#BASIC_LEXER
Oracle Text 詳細解説(pdfファイル)

投稿2019/07/16 08:26

編集2019/07/16 14:56
KOZ6.0

総合スコア2622

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2019/07/16 15:00

ご助言ありがとうございます。Google Chrome だとうまくいかなかったので IE で編集しなおしました。
Orlofsky

2019/07/16 19:09

Google Chrome のバージョンがかなり古いのでは?
KOZ6.0

2019/07/16 23:35

お、本当ですね。最新にしたらダイアログが閉じなくなりました。 重ね重ねありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問