﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Simple is the best!-随笔分类-Java</title><link>http://www.blogjava.net/chalmers/category/36060.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 12 Apr 2011 04:37:53 GMT</lastBuildDate><pubDate>Tue, 12 Apr 2011 04:37:53 GMT</pubDate><ttl>60</ttl><item><title>Lunce分词原理</title><link>http://www.blogjava.net/chalmers/archive/2011/04/10/348007.html</link><dc:creator>远帆</dc:creator><author>远帆</author><pubDate>Sun, 10 Apr 2011 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/chalmers/archive/2011/04/10/348007.html</guid><wfw:comment>http://www.blogjava.net/chalmers/comments/348007.html</wfw:comment><comments>http://www.blogjava.net/chalmers/archive/2011/04/10/348007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chalmers/comments/commentRss/348007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chalmers/services/trackbacks/348007.html</trackback:ping><description><![CDATA[Lucene是一个高性能的java全文检索工具包，它使用的是倒排文件索引结构。该结构及相应的生成算法如下： <br />
<br />
0）设有两篇文章1和2 <br />
文章1的内容为：Tom lives in Guangzhou,I live in Guangzhou too. <br />
文章2的内容为：He once lived in Shanghai. <br />
<br />
1)由于lucene是基于关键词索引和查询的，首先我们要取得这两篇文章的关键词，通常我们需要如下处理措施 <br />
a.我们现在有的是文章内容，即一个字符串，我们先要找出字符串中的所有单词，即分词。英文单词由于用空格分隔，比较好处理。中文单词间是连在一起的需要特殊的分词处理。 <br />
b.文章中的&#8221;in&#8221;, &#8220;once&#8221; &#8220;too&#8221;等词没有什么实际意义，中文中的&#8220;的&#8221;&#8220;是&#8221;等字通常也无具体含义，这些不代表概念的词可以过滤掉 <br />
c.用户通常希望查&#8220;He&#8221;时能把含&#8220;he&#8221;，&#8220;HE&#8221;的文章也找出来，所以所有单词需要统一大小写。 <br />
d.用户通常希望查&#8220;live&#8221;时能把含&#8220;lives&#8221;，&#8220;lived&#8221;的文章也找出来，所以需要把&#8220;lives&#8221;，&#8220;lived&#8221;还原成&#8220;live&#8221; <br />
e.文章中的标点符号通常不表示某种概念，也可以过滤掉 <br />
在lucene中以上措施由Analyzer类完成 <br />
<br />
经过上面处理后 <br />
文章1的所有关键词为：[tom] [live] [guangzhou] [i] [live] [guangzhou] <br />
文章2的所有关键词为：[he] [live] [shanghai] <br />
<br />
2) 有了关键词后，我们就可以建立倒排索引了。上面的对应关系是：&#8220;文章号&#8221;对&#8220;文章中所有关键词&#8221;。倒排索引把这个关系倒过来，变成：&#8220;关键词&#8221;对&#8220;拥有该关键词的所有文章号&#8221;。文章1，2经过倒排后变成 <br />
关键词 文章号 <br />
guangzhou 1 <br />
he 2 <br />
i 1 <br />
live 1,2 <br />
shanghai 2 <br />
tom 1 <br />
<br />
通常仅知道关键词在哪些文章中出现还不够，我们还需要知道关键词在文章中出现次数和出现的位置，通常有两种位置：a)字符位置，即记录该词是文章中第几个字符（优点是关键词亮显时定位快）；b)关键词位置，即记录该词是文章中第几个关键词（优点是节约索引空间、词组（phase）查询快），lucene中记录的就是这种位置。 <br />
<br />
加上&#8220;出现频率&#8221;和&#8220;出现位置&#8221;信息后，我们的索引结构变为： <br />
关键词 文章号[出现频率] 出现位置 <br />
guangzhou 1[2] 3，6 <br />
he 2[1] 1 <br />
i 1[1] 4 <br />
live 1[2],2[1] 2，5，2 <br />
shanghai 2[1] 3 <br />
tom 1[1] 1 <br />
<br />
以live 这行为例我们说明一下该结构：live在文章1中出现了2次，文章2中出现了一次，它的出现位置为&#8220;2,5,2&#8221;这表示什么呢？我们需要结合文章号和出现频率来分析，文章1中出现了2次，那么&#8220;2,5&#8221;就表示live在文章1中出现的两个位置，文章2中出现了一次，剩下的&#8220;2&#8221;就表示live是文章2中第 2个关键字。 <br />
<br />
以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的（lucene没有使用B树结构），因此lucene可以用二元搜索算法快速定位关键词。 <br />
<br />
实现时 lucene将上面三列分别作为词典文件（Term Dictionary）、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词，还保留了指向频率文件和位置文件的指针，通过指针可以找到该关键字的频率信息和位置信息。 <br />
<br />
Lucene中使用了field的概念，用于表达信息所在位置（如标题中，文章中，url中），在建索引中，该field信息也记录在词典文件中，每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。 <br />
<br />
为了减小索引文件的大小，Lucene对索引还使用了压缩技术。首先，对词典文件中的关键词进行了压缩，关键词压缩为&lt;前缀长度，后缀&gt;，例如：当前词为&#8220;阿拉伯语&#8221;，上一个词为&#8220;阿拉伯&#8221;，那么&#8220;阿拉伯语&#8221;压缩为&lt;3，语&gt;。其次大量用到的是对数字的压缩，数字只保存与上一个值的差值（这样可以减小数字的长度，进而减少保存该数字需要的字节数）。例如当前文章号是16389（不压缩要用3个字节保存），上一文章号是16382，压缩后保存7（只用一个字节）。 <br />
<br />
下面我们可以通过对该索引的查询来解释一下为什么要建立索引。 <br />
假设要查询单词 &#8220;live&#8221;，lucene先对词典二元查找、找到该词，通过指向频率文件的指针读出所有文章号，然后返回结果。词典通常非常小，因而，整个过程的时间是毫秒级的。 <br />
而用普通的顺序匹配算法，不建索引，而是对所有文章的内容进行字符串匹配，这个过程将会相当缓慢，当文章数目很大时，时间往往是无法忍受的。
<img src ="http://www.blogjava.net/chalmers/aggbug/348007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chalmers/" target="_blank">远帆</a> 2011-04-10 14:22 <a href="http://www.blogjava.net/chalmers/archive/2011/04/10/348007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi 的由来</title><link>http://www.blogjava.net/chalmers/archive/2010/01/03/308089.html</link><dc:creator>远帆</dc:creator><author>远帆</author><pubDate>Sun, 03 Jan 2010 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/chalmers/archive/2010/01/03/308089.html</guid><wfw:comment>http://www.blogjava.net/chalmers/comments/308089.html</wfw:comment><comments>http://www.blogjava.net/chalmers/archive/2010/01/03/308089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chalmers/comments/commentRss/308089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chalmers/services/trackbacks/308089.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 简述组件的定义&nbsp;&nbsp;<a href='http://www.blogjava.net/chalmers/archive/2010/01/03/308089.html'>阅读全文</a><img src ="http://www.blogjava.net/chalmers/aggbug/308089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chalmers/" target="_blank">远帆</a> 2010-01-03 16:24 <a href="http://www.blogjava.net/chalmers/archive/2010/01/03/308089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战JMX</title><link>http://www.blogjava.net/chalmers/archive/2008/12/23/247968.html</link><dc:creator>远帆</dc:creator><author>远帆</author><pubDate>Tue, 23 Dec 2008 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/chalmers/archive/2008/12/23/247968.html</guid><wfw:comment>http://www.blogjava.net/chalmers/comments/247968.html</wfw:comment><comments>http://www.blogjava.net/chalmers/archive/2008/12/23/247968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chalmers/comments/commentRss/247968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chalmers/services/trackbacks/247968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如题&nbsp;&nbsp;<a href='http://www.blogjava.net/chalmers/archive/2008/12/23/247968.html'>阅读全文</a><img src ="http://www.blogjava.net/chalmers/aggbug/247968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chalmers/" target="_blank">远帆</a> 2008-12-23 21:08 <a href="http://www.blogjava.net/chalmers/archive/2008/12/23/247968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java网络编程点滴</title><link>http://www.blogjava.net/chalmers/archive/2008/12/02/244035.html</link><dc:creator>远帆</dc:creator><author>远帆</author><pubDate>Tue, 02 Dec 2008 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/chalmers/archive/2008/12/02/244035.html</guid><wfw:comment>http://www.blogjava.net/chalmers/comments/244035.html</wfw:comment><comments>http://www.blogjava.net/chalmers/archive/2008/12/02/244035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chalmers/comments/commentRss/244035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chalmers/services/trackbacks/244035.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 记录使用java进行网络编程时遇到的问题&nbsp;&nbsp;<a href='http://www.blogjava.net/chalmers/archive/2008/12/02/244035.html'>阅读全文</a><img src ="http://www.blogjava.net/chalmers/aggbug/244035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chalmers/" target="_blank">远帆</a> 2008-12-02 22:33 <a href="http://www.blogjava.net/chalmers/archive/2008/12/02/244035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于单元测试很好的总结&lt;转&gt;</title><link>http://www.blogjava.net/chalmers/archive/2008/11/24/242352.html</link><dc:creator>远帆</dc:creator><author>远帆</author><pubDate>Mon, 24 Nov 2008 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/chalmers/archive/2008/11/24/242352.html</guid><wfw:comment>http://www.blogjava.net/chalmers/comments/242352.html</wfw:comment><comments>http://www.blogjava.net/chalmers/archive/2008/11/24/242352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chalmers/comments/commentRss/242352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chalmers/services/trackbacks/242352.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/chalmers/archive/2008/11/24/242352.html'>阅读全文</a><img src ="http://www.blogjava.net/chalmers/aggbug/242352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chalmers/" target="_blank">远帆</a> 2008-11-24 20:05 <a href="http://www.blogjava.net/chalmers/archive/2008/11/24/242352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.NoClassDefFoundError出现的可能几种情况</title><link>http://www.blogjava.net/chalmers/archive/2008/11/11/239913.html</link><dc:creator>远帆</dc:creator><author>远帆</author><pubDate>Tue, 11 Nov 2008 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/chalmers/archive/2008/11/11/239913.html</guid><wfw:comment>http://www.blogjava.net/chalmers/comments/239913.html</wfw:comment><comments>http://www.blogjava.net/chalmers/archive/2008/11/11/239913.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chalmers/comments/commentRss/239913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chalmers/services/trackbacks/239913.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如题&nbsp;&nbsp;<a href='http://www.blogjava.net/chalmers/archive/2008/11/11/239913.html'>阅读全文</a><img src ="http://www.blogjava.net/chalmers/aggbug/239913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chalmers/" target="_blank">远帆</a> 2008-11-11 16:53 <a href="http://www.blogjava.net/chalmers/archive/2008/11/11/239913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>