我们正在运行基于Spring MVC(3.2.3),Hibernate(3.3.2)和Sybase ASE 15.5作为底层数据库的Web应用程序。我们有几个数据实体(订单,参与者,客户等),我们的客户要求是搜索应该非常灵活。这意味着用户可以在搜索字段中输入一个或多个搜索词,并且该字符串(或数字或日期)可以是任何已定义的“可搜索”字段列表的部分匹配。
目前,这会导致以
形式出现的丑陋搜索SQLselect ...
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上有120万行,在ADDRESSMASTER上有500k行。由于数据如此之少,搜索结果几乎可以立即获得,但事实并非如此。搜索最多可能需要几秒钟,具体取决于锁定等待的次数。
全文搜索会解决此问题吗?有没有人有类似已经解决的情况的经验? Sybase过去常常提供“ASE - 增强型全文搜索选项”,但已停止使用而无需替换。我们应该研究一下Apache Lucene吗?
由于 西蒙