oracle全文检索(oracle text)记录
最近总结了一下,相关例子和部分内容也是搜索于网络,具体分下面几部分:
1.全文检索和普通检索的区别
不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作:
1 2 | SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0; SELECT * FROM mytext WHERE thetext LIKE '%Oracle%'; |
有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候。然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限,因此对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能。
附:这里顺带记录一下INSTR和LIKE:
Oracle中,可以使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符。其语法为:Instr(string, substring, position, occurrence)。
string:代表源字符串(写入字段则表示此字段的内容)。
substring:代表想从源字符串中查找的子串。
position:代表查找的开始位置,该参数可选的,默认为1。
occurrence:代表想从源字符中查找出第几次出现的substring,该参数也是可选的,默认为1。
position 的值为负数,那么代表从右往左进行查找。
instr和like的性能比较
其实从效率角度来看,谁能用到索引,谁的查询速度就会快。
like有时可以用到索引,例如:name like ‘李%’,而当下面的情况时索引会失效:name like ‘%李’。所以一般我们查找中文类似于‘%字符%’时,索引都会失效。与其他数据库不同的是,oracle支持函数索引。例如在name字段上建个instr索引,查询速度就比较快了,这也是为什么instr会比like效率高的原因。
注:instr(title,’手册’)>0 相当于like‘%手册%’
instr(title,’手册’)=0 相当于not like‘%手册%’
2.设置全文检索
步骤步骤一:检查和设置数据库角色
首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能(10G默认安装都有此用户和角色)。你必须修改数据库以安装这项功能。默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys的用户。
步骤二:赋权
在ctxsys用户下,授予测试用户oratext以下权限:
1 2 3 4 5 6 7 8 9 | GRANT resource, CONNECT, ctxapp TO oratext; GRANT EXECUTE ON ctxsys.ctx_cls TO oratext; GRANT EXECUTE ON ctxsys.ctx_ddl TO oratext; GRANT EXECUTE ON ctxsys.ctx_doc TO oratext; GRANT EXECUTE ON ctxsys.ctx_output TO oratext; GRANT EXECUTE ON ctxsys.ctx_query TO oratext; GRANT EXECUTE ON ctxsys.ctx_report TO oratext; GRANT EXECUTE ON ctxsys.ctx_thes TO oratext; GRANT EXECUTE ON ctxsys.ctx_ulexer TO oratext; |
步骤三:设置词法分析器(lexer)
Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term)找出来,记录在一组以dr$开头的表中,同时记下该term出现的位置、次数、hash值等信息。检索时,Oracle从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle针对不同的语言提供了不同的lexer,而我们通常能用到其中的三个:
Oracle集群(RAC)
Oracle11G集群测试记录.
这次的客户是双机访问操作数据库,一台实例名是orcl1,一台是orcl2。访问数据库服务名是orcl,之前我也搜了些资料,最后的想法是写了一个测试程序来测试JDBC链接ORACLE RAC的连接串。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class RacTest { /** * 测试RAC * */ public static void main(String[] args) throws ClassNotFoundException { String url; Connection conn = null; Statement stmt = null; ResultSet rs = null; Properties conProps = new Properties(); conProps.put("user", "sys"); conProps.put("password", "sys"); conProps.put("internal_logon", "sysdba"); // String username = "sys"; // String password = "oracle"; url = "jdbc:oracle:thin:@(description= (ADDRESS_LIST ="; url += "(address=(protocol=tcp)(host=10.37.27.111)(port=1521))"; url += "(address=(protocol=tcp)(host=10.37.27.112)(port=1521))"; url += "(load_balance=yes))"; url += "(connect_data ="; url += "(server = dedicated)"; url += "(service_name=orcl)"; url += "(failover_mode ="; url += "(type=session)"; url += "(method=basic)"; url += "(retries=5)"; url += "(delay=15))"; url += " ))"; String sql = "select * from v$instance"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection(url, conProps); // conn = DriverManager.getConnection(url, username, password); stmt = conn.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) { System.out.print(rs.getString("INSTANCE_NAME")); } rs.close(); rs = null; stmt.close(); stmt = null; conn.close(); conn = null; } catch (SQLException ex) { ex.printStackTrace(); } finally { if (rs != null) { try { rs.close(); rs = null; } catch (Exception ex) { ex.printStackTrace(); } } if (stmt != null) { try { stmt.close(); stmt = null; } catch (Exception ex) { ex.printStackTrace(); } } if (conn != null) { try { conn.close(); conn = null; } catch (SQLException ex) { ex.printStackTrace(); } } } } } |


(1 次评分, 平均: 4.00 out of 5)