我们有一个包含大量列的Address
表。
示例架构
地址:
Id | ADDR_LN1 | ADDR_LN2 | ADDR_LN3
---------------------------------------
1 | 3330 Scott st | Suite 300 | Houston TX 77058
用户使用3个输入字段搜索文本:
Textinput1: 3330 Scott Street
Textinput2: Room 300 //
Textinput3: Houston tx
对于用户来说,这是一种正确的格式,他开始搜索他需要的内容。如何使用select语句以便返回DB中可用的行?
我尝试过类似于以下内容(现在考虑不区分大小写),但从性能的角度看似乎并不正确。有人能指出我正确的方向吗?
select *
from address addr
where addr.addr_ln1 like '%3330 Scott street%'
and (
addr.addr_ln2 like '%room 300%'
or addr.addr_ln2 like '%300%'
)
and addr.addr_ln3 like '%houston tx%'
答案 0 :(得分:2)
经常忽略的Oracle SOUNDEX函数可能值得尝试"模糊"(ish)匹配。我使用了Oracle Text / InterMedia(CTXSYS)来搜索存储在BLOB中的PDF / DOC文件。那么,那里可能有范围,你持有一个列CLOB,它是连接的所有文本(触发器保持?),然后通过CTXSYS索引,然后你就可以在WHERE子句中使用CONTAINS命令。请参阅以下链接以帮助您入门:
http://docs.oracle.com/cd/B28359_01/text.111/b28303/quicktour.htm#i1008390
警告但是,由于搜索依赖于索引是最新的,我们发现唯一可靠的方法是确保在文档作为事务的一部分上载时运行ctxsys.ctx_ddl.sync_index。