2013-05-02 113 views
3

我需要使用某种模糊搜索(比如来自oracle的模糊搜索并使用索引来搜索数据库表,因为我不想要表扫描(有大量数据)。使用索引搜索相似单词

我想忽略的情况下,语言的特殊的东西(N,SS,...)和)特殊字符,如_,(+, - ,等...

搜索 “玛丽亚(酷)” 应获得“玛丽亚 - 酷”和“玛丽亚_酷”作为比赛。
Oracle在某种程度上可能吗?

关于这种情况,我认为可以通过小写的方式直接创建索引,并且总是以较小的值进行搜索。但我不知道如何解决特殊字符的东西。
我想过如何在没有特殊字符的情况下将数据存储在独立的列中,然后搜索那些返回真实数据的数据,但我不能100%确定那里是完美的解决方案。

任何想法?

回答

3

也许UTL_MATCH可以提供帮助。

但你也可以创建一个函数的索引,可以说,这样的事情:

regexp_replace(your_column, '[^0-9a-zA-Z]+', ' ') 

,然后尝试让这样的:

... 
WHERE regexp_replace(your_column, '[^0-9a-zA-Z]+', ' ') = 
     regexp_replace('maria (cool)' , '[^0-9a-zA-Z]+', ' ') 

Here is a sqlfiddle demo这不是完整的,但能是一个开始

+0

看起来不错,但特定的语言,如口音或ñ? :S。谢谢! – 2013-05-02 13:56:40

+0

请参阅我的sqlfiddle演示,它包含一些特殊字符的示例 - 我使用了'translate function' – 2013-05-02 15:35:41

+0

很好,但我必须指定所有字符。只是最后一个问题! :P这会比复制具有“降级”数据的列更好(更高效)吗?谢谢! – 2013-05-02 18:13:03