- 浏览: 85466 次
- 来自: 济南
最新评论
-
lib:
速度很快啊!下手很早啊。
在Raspberry Pi上安装Nodejs环境 -
qalong:
如此好文,哪能不顶
Canvas入门实例08:三次方贝塞尔曲线 -
johnnycmj:
膜拜啊....
简单模拟Google的大马跑啊跑的Doodle -
BuN_Ny:
zeng1990 写道BuN_Ny 写道feizhang666 ...
17) 第二章 索引:优化索引(Optimizing) -
zeng1990:
BuN_Ny 写道feizhang666 写道现在已经是luc ...
17) 第二章 索引:优化索引(Optimizing)
文章列表
原文地址( https://developer.mozilla.org/En/Canvas_tutorial )
<canvas>是一个新的HTML元素,这个元素可以被Script语言(通常是JavaScript)用来绘制图形。例如可以用它来画图、合成图象、或做简单的(和不那么简单的)动画。
<canvas>最先在苹果公司(Apple)的Mac OS X Dashboard上被引入,而后被应用于Safari。基于Gecko1.8的浏览器,例如Firefox 1.5,也支持这个新元素。元素<canvas>是WhatWG Web appl ...
JavaScript 闭包
- 博客分类:
- JavaScript
原文地址:http://jibbering.com/faq/notes/closures/
简介
Closure
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
闭包是 ECMAScri ...
首先需要清楚一个大前提:在同一个索引文件上,一次只能存在一个writer!
那如果有多个IndexWriter要访问一个索引文件该怎么办?加锁!
Lucene自身提供了4种锁策略:
1) SimpleFSLockFactory
这是基于文件系统的索引默认使用的锁的实现方式。
SimpleFSLockFactory的思路其实就是在IndexWriter访问索引文件的时候,创建一个名为write.lock的文件,再有别的IndexWriter访问该索引文件时,由于发现了write.lock文件的存在,会先暂时等待,直到write.loc ...
索引文件的多个段可以合并成一个或少量几个。这样将节省一部分硬盘空间,更重要的是,它可以加快搜索速度。需要注意的是,是加快搜索速度,并非加快索引速度。方法很简单:
optimize(int maxNumSegments, boolean doWait);
maxNumSegments 代表合并后可能存在的最大段数,也就是传入5,合并完可能存在1或2或3或4或5个段;另外就是,合并成1个段比合并成5个更耗时。
doWait 表示是否等待。如果传入false,则该方法会立即返回,索引文件的合并工作将在后台执行。
只提供一个方法是不是显得太单调了?Luce ...
针对Field我们还有最后一个特性要讨论:截断(truncation)。其实就是之前"基本索引操作"中提到的 MaxFieldLength 问题。如果只是从字面上感觉,它就是个设置Field最大长度的值。
那么它到底是设置一个文档中同名域的最大个数还是不同文档的同名域的最大个数?是设置同名域的最大Term数还是一个域的最大Term数?
答案是:一个域的最大Term数。也就是说,我们第十节(Field中含多个值的问题)中所讲的方式索引的同名Field,属于不同的Field实例,并非整个名为"author"的域的最大长度受限, ...
这一节非常非常简单,场景是这样的:我们对Lucene原生的排序结果不感兴趣,而是希望按我们的意志针对某个域排序。
记住三点:
1) 设计这么一个单独的域,用它来排序;
2) 保证此Field下每个文档中仅含一个词元(通常的方法是设置Field.Index.NOT_ANALYZED,当然,采用KeywordAnalyzer等仅会产生一个词元的分析器去分词也可以);
3) Field的值要能够转化成整型、浮点型或字符串(尽管索引阶段数字是被当成字符存储的,但要保证它在排序时能被转换回数字)。
就这些了,多说无益。
...
索引数字的场景主要有两种:一是把它们当作字符串一样处理,比如“要是搁以前,术士能暴击10000多,有木有!”中的"10000",它和其它的词没什么区别,你可以把它仅仅想成一个字符串;另一种场景则是某个域只索引数字,且可以搜索数字的范围等,比如设计了某个Field存储邮件的大小,现在要搜索大小在3M-10M的邮件。
对于第一种情况,你要做的仅仅是选一个不会对数字进行分词的分析器。这种分析器很多,比如之前我们用过的WhitespaceAnalyzer和StandardAnalyzer。当然WhitespaceAnalyzer分析器可能仅仅对英语之类的 ...
对Lucene而言,每个域都是String类型。然而在真实的应用中,我们还会遇到诸如日期、整数、浮点数等其它类型。如何是好?Lucene自然有其处理之道。
先让我们来看看Lucene是怎么处理日期类型的吧!
日期类型的使用场景可谓多之又多:邮件的寄出、收到日期;文件的创建日期、最后修改日期;HTTP响应中的最后修改日期等等。总之,绝大多数情况下,你会有处理日期的遭遇!Don't worry! Lucene为我们装备了一个处理日期的利器:DateTools. 通过它,我们可以便捷的把Date型转换成String型:
Document doc = ...
在索引阶段,文档(Document)中每个被索引的域(Field)都可能有一个优先权重因数(boost),它是一个浮点值。该值由三部分联合计算得到:文档自身的boost值;每个域的值;Lucene根据各词元在域中的频度算出的boost值;
得到最终的boost值后,Lucene会通过一些巧妙的方法把它转换成一个字节,并将其存入文档的各个域。待到搜索阶段,每个被查询域的规则都将被加载到内存,将字节解码成浮点数并依此为该文档打分(打出的分数用来为文档排序)。
使用规则时经常遭遇的一个问题是:查询期间的高内存消耗。原因很明显,每个文档的每个域的规则都要在内存中占 ...
请先确认一句话:“并非人人生而平等!”。对于Document和Field也是如此。
假设你现在需要索引一些邮件。要求是,搜索结果中,船长发出的邮件要排在船员的前面!如何实现?
还好Lucene为你提供了它的实现,而且非常简单:boosting. 每个文档都拥有一个优先权重因数,默认情况下它的值是1.0, 你可以通过改变此值来实现上面的要求。重要的文档(此例中为船长的邮件),我们可以让这个数大于1.0, 比如2.0如何?次要的文档(此例中为船员的邮件),我们可以让这个数小于1.0, 比如0.5。 当然,也可以让重要的为3.0,次要的为2.0,怎么设计随你。
那 ...
假设你的Document中有一个名为"author"的Field, 然而有时一篇文章的作者不止一个。如何解决这个问题呢?一种方法是,你可以先循环遍历所有作者,将他们的名字拼接成一个String,然后再根据这个String去创建Lucene的Field;另一种更为优雅的方式,则是直接往这个Field中加入不同的值:
Document doc = new Document();
for (int i = 0; i < authors.length; i++) {
doc.add(new Field("author" ...
Field也许算是Lucene索引阶段最重要的类,它是存储被索引值的类。当创建Field时,Lucene为其提供了诸多选项供你选择。
1. 索引
索引选项(Field.Index.*)用来控制域中的文本如何通过反向索引搜索。共有如下选项:
1) Index.ANALYZED
最常用的设置,采用分词策略,将原文拆分成词元(通常用在正文、标题、摘要等域)
2) Index.NOT_ANALYZED
不采用分词策略,即把原文当作一整个词元对待(通常用在URL、文件路径、日期等域)
3) Index ...
1. @Indexed
-> index 指定索引名称
2. @Field
-> name 指定当前属性在Lucene Document中存储的名称,默认为属性名
-> store 指定当前属性是否被存储在Lucene index中,可选值为:
1) Store.YES 占用大量的索引空间,支持"投影(projection)"
2) Store.COMPRESS 压缩方式,消耗大量CPU
3) Store.NO (default)
-> index 指定元素索引方式和信息存储 ...
先上示例代码,原意看的就看,不愿意看的先略过,回头再对照着看也行:
import java.io.IOException;
import junit.framework.TestCase;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
im ...