oracle全文检索(oracle text)记录

By19.Published on四月 27, 2010 20:58. 68 Views .
很差差一般好非常好 (1 次评分, 平均: 4.00 out of 5)
Loading ... Loading ...

最近总结了一下,相关例子和部分内容也是搜索于网络,具体分下面几部分:

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,而我们通常能用到其中的三个:

继续阅读…Continue reading…

{ 2 comments } { Tags: }

更改自levitated.net的FLASH TAGS CLOUD(2)

By19.Published on四月 22, 2010 16:56. 20 Views .
很差差一般好非常好 (暂时没有评分)
Loading ... Loading ...

继续上一篇,这个效果我觉得才是真正的有云的感觉(以下为上篇文章的原文引用):

续我上次以Levitated.net的源码为基础,修改并发表了一篇WP的TAGS墙~之后,这次又以其提供的开源小应用修改了两个FLASH的标签云。本来连改了好几个效果,不过最后就两个合适的。分两篇文章发布,分开发布原因是两个标签云放在一个页面性能上有问题……

Levitated.net上的源码离现在已经很多年了,时间虽然长,不过他提供的算法还是值得我们借鉴。此次提供的两个标签云都可以进行例如字体颜色及背景颜色的配置(通过参数),标签云FLASH的宽和高可以随意设置,生成的标签完全自适应显示。

这是另一个,有点黑客帝国代码滚动的感觉http://www.ll19.com/levitated-flash-tags-cloud1.html

FLASH通过读取XML进行标签显示,下面为XML的格式:

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<tags><name>java</name><link>java</link></tags>
	<tags><name>as3</name><link>as3</link></tags>
</root>

XML地址通过传入xmlUrl参数的值设置,例如此FLASH传入的地址为(http://www.ll19.com/wp-content/plugins/19_tags_cloud/19tags.php),下面为具体的引用:

1
2
3
4
5
<object id="rssReader" type="application/x-shockwave-flash" data="http://www.ll19.com/wp-content/plugins/19_tags_cloud/textInSpace.swf" width="100%" height="100%">
	<param name="movie" value="http://www.ll19.com/wp-content/plugins/19_tags_cloud/textInSpace.swf" />
	<param name="wmode" value="transparent" />
	<param name="FlashVars" value="xmlUrl=http://www.ll19.com/wp-content/plugins/19_tags_cloud/19tags.php">
</object>

如果是WordPress顺便提供一个简单的WP TAGS XML生成程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
include_once ('../../../wp-config.php');
global $wpdb;
$sql = "SELECT wtt.term_id as id,count,name,slug FROM $wpdb->term_taxonomy AS wtt , $wpdb->terms AS wt where wtt.term_id = wt.term_id and taxonomy = 'post_tag' ORDER BY count DESC LIMIT 0 , 100 ";
$content = $wpdb->get_results($sql);
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
echo "<root>";
global $tags_19;
foreach ($content as $tags_19)
	: echo "<tags>";
echo "<name>";
echo $tags_19->name;
echo "</name>";
echo "<link>";
echo $tags_19->slug;
echo "</link>";
echo "</tags>";
endforeach;
echo "</root>";

点击了标签后会跳转到相关链接,这里跳转链接的操作不是从FLASH中直接打开,而是通过调用页面的JS函数(tagsCall)来打开相关页面,即点击了tags节点中的name标签会传回link的值供JS(tagsCall)调用。下面是JS例子:

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
function tagsCall(tagLink) {
	var url = "http://www.ll19.com/tag/" + tagLink;
	win = window.open(url, "_blank");
	if (!win) {
		window.open(url, "_self");
	}
}
</script>

这样做就是为了不要搞的只是打开链接那么死板,也许有别的事情可做,所以你在使用过程中只要按照XML的格式生成TAGS的节点后将这个地址以xmlUrl传入FLASH,再写一个tagsCall的JS函数进行相关操作就OK了。

此标签云一些其他的相关配置:

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
//XML
public static var xmlUrl : String = "../../xml/tag.xml";
 
//影片质量
public static var quality : String = "low";
 
//是否显示FPS
public static var fps : Boolean = false; 
 
//主背景颜色
public static var backgroundColor : uint = 0x000000;
 
//FPS的颜色和字体
public static var fpsTextColor : uint = 0xFFFFFF;
public static var fpsTextFace : String = "Georgia";
 
//字体
public static var textFace : String = "Georgia";
public static var textSize : Number = 16;
public static var textColor : uint = 0xFFFFFF;
 
//模糊效果抗锯齿的配置 不过性能有很大影响
public static var filter : Boolean = false;
public static var blurFilterX : Number = 2;
public static var blurFilterY : Number = 2;
public static var blurFilterQ : Number = 1;
 
//是否显示鼠标移动上去的发光效果
public static var move : Boolean = false;
 
//移动用的参数(建议默认不要更改)
public static var fl : Number = 1000;
public static var xx : Number = 0;
public static var yy : Number = 0;
public static var zz : Number = 500;
public static var dx : Number = 0;
public static var dy : Number = 0;
public static var dz : Number = -500;

可以通过传入与静态变量名相同的参数值来配置标签云的显示或运行效果,例如-这是一个配置了不同背景及字体颜色的效果(如下传入了backgroundColor和textColor的值),具体的不同颜色的演示效果http://www.ll19.com/up/19_tags_cloud/textInSpace.html

1
<param name="FlashVars" value="xmlUrl=http://www.ll19.com/wp-content/plugins/19_tags_cloud/19tags.php&backgroundColor=0xffffff&textColor=0x000000">

源码下载地址:

http://code.google.com/p/glll/downloads/detail?name=19_tags_cloud.7z

{ 5 comments } { Tags: , , }