基盤となるデータベースとして Sybase ASE 15.5 を使用して、Spring MVC (3.2.3)、Hibernate (3.3.2) に基づく Web アプリケーションを実行しています。いくつかのデータ エンティティ (注文、参加者、顧客など) があり、顧客の要件は、検索が非常に柔軟に機能することです。これは、ユーザーが検索フィールドに 1 つまたは複数の検索用語を入力できること、およびその文字列 (または数値、または日付) が、「検索可能な」フィールドの定義済みリストのいずれかと部分的に一致する可能性があることを意味します。
現在、これは次の形式の醜い検索 SQL になります。
select ...
from ORDERS ordermodel0_
inner join ADDRESSMASTER addressmas1_ on ordermodel0_.OWNERID=addressmas1_.ID
where (ordermodel0_.TITLE like '%smith%'
or ordermodel0_.EXTERNALNR like '%smith%'
or addressmas1_.NAME like '%smith%'
or addressmas1_.FIRSTNAME like '%smith%'
or exists (select participan2_.ID from PARTICIPANTS participan2_
where ordermodel0_.ID=participan2_.ORDERID
and (participan2_.FIRSTNAME like '%smith%'
or participan2_.LASTNAME like '%smith%')))
ワイルドカード検索ではインデックスを使用できないため、最終的には、クエリ プランでこれらのテーブルをすべて読み取ることになります (テーブル スキャン)。ORDERS に 50 万行、PARTICIPANTS に 120 万行、ADDRESSMASTER に 50 万行あります。データが非常に少ないため、検索結果はほぼ瞬時に表示されるはずですが、そうではありません。ロック待機の数によっては、検索に数秒かかる場合があります。
全文検索でこの問題は解決しますか? すでに解決されている同様の状況を経験した人はいますか? Sybase は以前、「ASE - 拡張全文検索オプション」を提供していましたが、これは置き換えられることなく廃止されました。Apache Lucene を調べる必要がありますか?
ありがとうサイモン