2

Oracle 11g の Contains() 関数を使用して、ユーザーが入力したフィールドに含まれる正確なテキストを検索する必要がありました。「いいね」演算子を使用しないように求められました。

Oracleのドキュメントによると、すべてが機能するには次のことが必要です。

  • 二重}文字
  • 入力全体を間に入れます{}

これは、一部を除いてほとんどの場合に機能します。その下にテストケースがあります:

create table theme
  (name varchar2(300 char) not null);

insert into theme (name)
values ('a');

insert into theme (name)
values ('b');

insert into theme (name)
values ('a or b');

insert into theme (name)
values ('Pdz344_1_b');

create index name_index on theme(name) indextype is ctxsys.context;

演算子が解釈された場合、'or'4 つの結果すべてが得られますが、そうではないことを願っています。以下を実行すると、 のみが見つかると予想されます'a or b'

select * from theme
where contains(name, '{a or b}')>0;

しかし、私も得'Pdz344_1_b'ます。しかし、ありません'a''o'ありません'r'。このテキストが一致することは非常に驚くべきことです。contains() の構文についてわからないことはありますか?

4

1 に答える 1

4

CONTAINSLIKEオペレーターのようではありません。ORACLE TEXT文字列の一致だけでなく、検索エンジン(Google検索のようなもの)を使用しているため。

{}- はエスケープマーカーです。内部に入れるものはすべて、エスケープするテキストとして扱う必要があることを意味します。

したがって、クエリを発行して、またはのように見えa or bないテキストを検索します。char が含まれているため、クエリは照合されます。abPdz344_1_bb

デフォルトのストップ リストに文字が存在するため、文字のみの行aは一致しません。a

なぜb一致しないのですか?一致シーケンスが実際には のように見えるためa\ or\ bです。したがって、3 つのトークンがa _or _bあります (アンダースコアはスペースを表します)。aストップ リストには1 文字しかないため_b、行には文字列がありません。ただし、アルファベット以外の文字は空白として扱われるためb、この組み合わせが行に含まれています。Pdz344_1_bを削除{}またはクエリすると {b or a}、一致も取得bされます。

于 2013-10-28T09:10:10.830 に答える