0

我们正在运行一个基于 Spring MVC (3.2.3)、Hibernate (3.3.2) 和 Sybase ASE 15.5 作为底层数据库的 Web 应用程序。我们有几个数据实体(订单、参与者、客户等),我们的客户要求是搜索应该非常灵活。这意味着用户可以在搜索字段中输入一个或多个搜索词,并且该字符串(或数字或日期)可以是任何定义的“可搜索”字段列表的部分匹配。

目前,这会导致以下形式的丑陋搜索 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 上有 500k 行,在 PARTICIPANTS 上有 1.2 Mio 行,在 ADDRESSMASTER 上有 500k 行。有了这么少的数据,搜索结果应该几乎是即时可用的,但事实并非如此。搜索最多可能需要几秒钟,具体取决于锁定等待的数量。

全文搜索能解决这个问题吗?有没有人遇到过已经解决的类似情况?Sybase 曾经提供“ASE - 增强的全文搜索选项”,但该选项在没有替换的情况下停产。我们应该研究 Apache Lucene 吗?

谢谢西蒙

4

0 回答 0