
Lucene
文章平均质量分 85
uniorg
护雪在线
展开
-
Lucene学习总结之六:Lucene打分公式的数学推导
<br /><br />在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下。因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数。<br />Lucene的打分公式非常复杂,如下:<br /> <br /><br /> <br />在推导之前,先逐个介绍每部分的意义:t:Term,这里的Term是指包含域信息的Term,也即title:hello和content:hello是不同的Termcoord(q,d):一次搜索可能包含多转载 2010-12-23 13:56:00 · 569 阅读 · 0 评论 -
如何提高和优化Lucene索引速度
这篇文章主要介绍了如何提高Lucene的索引速度。介绍的大部分思路都是很容易尝试的,当然另外一部分可能会加大你程序的复杂度。所以请确认索引速度确实很慢,而且很慢的原因确实是因为Lucene自身而造成的。推荐姐妹篇:如何提高和优化Lucene搜索速度• 确认你在使用最新的Lucene版本。• 尽量使用本地文件系统远程文件系统一般来说都会降低索引速度。如果索引必须分布在远程服务器,请尝试先在本地生成索引,然后分发到远程服务器上。• 使用更快的硬件设备,特别是更快的IO设备• 在索引期间复用单一的IndexWri翻译 2011-01-10 17:14:00 · 1410 阅读 · 0 评论 -
lucene3.0范围查找TermRangeQuery
<br /><br />在lucene3.0中,范围查询也有很大的变化,RangeQuery已经不推荐使用,使用TermRangeQuery和NumericRangeQuery两个替代。<br />TermRangeQuery:主要用于文本范围查找;<br />IndexReader reader = IndexReader<br />.open(FSDirectory.open(INDEX_DIR), true); // only searching,<br />Searcher searcher = n转载 2010-12-24 09:32:00 · 2276 阅读 · 1 评论 -
Lucene学习总结之九:Lucene的查询对象(1)
<br /><br />Lucene除了支持查询语法以外,还可以自己构造查询对象进行搜索。<br />从上一节的Lucene的语法一章可以知道,能与查询语句对应的查询对象有:BooleanQuery,FuzzyQuery,MatchAllDocsQuery,MultiTermQuery,MultiPhraseQuery,PhraseQuery,PrefixQuery,TermRangeQuery,TermQuery,WildcardQuery。<br />Lucene还支持一些查询对象并没有查询语句与之对应转载 2010-12-23 14:11:00 · 834 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(8)
<br />2.4、搜索查询对象<br /> <br /> 2.4.4、收集文档结果集合及计算打分<br />在函数IndexSearcher.search(Weight, Filter, int) 中,有如下代码:<br />TopScoreDocCollector collector = TopScoreDocCollector.create(nDocs, !weight.scoresDocsOutOfOrder());<br />search(weight, filter, collector);<b转载 2010-12-23 14:07:00 · 649 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(5)
<br />2.4、搜索查询对象<br /> <br /> 2.4.2、创建Scorer及SumScorer对象树<br />当创建完Weight对象树的时候,调用IndexSearcher.search(Weight, Filter, int),代码如下:<br /> <br />//(a)创建文档号收集器<br />TopScoreDocCollector collector = TopScoreDocCollector.create(nDocs, !weight.scoresDocsOutOfOrde转载 2010-12-23 14:01:00 · 651 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(3)
<br />2.3、QueryParser解析查询语句生成查询对象<br />代码为:<br />QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Version.LUCENE_CURRENT));<br />Query query = parser.parse("+(+apple* -boy) (cat* dog) -(eat~ foods)");<br />此过程相对转载 2010-12-23 13:59:00 · 604 阅读 · 0 评论 -
Lucene学习总结之五:Lucene段合并(merge)过程分析
<br />一、段合并过程总论<br />IndexWriter中与段合并有关的成员变量有:<br /> HashSet<SegmentInfo> mergingSegments = new HashSet<SegmentInfo>(); //保存正在合并的段,以防止合并期间再次选中被合并。MergePolicy mergePolicy = new LogByteSizeMergePolicy(this);//合并策略,也即选取哪些段来进行合并。MergeScheduler mergeScheduler =转载 2010-12-23 13:55:00 · 738 阅读 · 0 评论 -
Lucene学习总结之十:Lucene的分词器Analyzer
<br />1、抽象类Analyzer<br />其主要包含两个接口,用于生成TokenStream:TokenStream tokenStream(String fieldName, Reader reader);TokenStream reusableTokenStream(String fieldName, Reader reader) ;<br />所谓TokenStream,后面我们会讲到,是一个由分词后的Token结果组成的流,能够不断的得到下一个分成的Token。<br />为了提高性能,使得转载 2010-12-23 14:18:00 · 906 阅读 · 0 评论 -
Lucene学习总结之九:Lucene的查询对象(3)
<br />6、FilteredQuery<br />FilteredQuery包含两个成员变量:Query query:查询对象Filter filter:其有一个函数DocIdSet getDocIdSet(IndexReader reader) 得到一个文档号集合,结果文档必须出自此文档集合,注此处的过滤器所包含的文档号并不是要过滤掉的文档号,而是过滤后需要的文档号。<br />FilterQuery所得到的结果集同两者取AND查询相同,只不过打分的时候,FilterQuery只考虑query的部分,转载 2010-12-23 14:15:00 · 731 阅读 · 0 评论 -
Lucene学习总结之九:Lucene的查询对象(2)
<br />5、SpanQuery<br />所谓SpanQuery也即在查询过程中需要考虑进Term的位置信息的查询对象。<br />SpanQuery中最基本的是SpanTermQuery,其只包含一个Term,与TermQuery所不同的是,其提供一个函数来得到位置信息:<br />public Spans getSpans(final IndexReader reader) throws IOException {<br /> return new TermSpans(reader.termPos转载 2010-12-23 14:13:00 · 643 阅读 · 0 评论 -
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(2)
<br />三、解析QueryParser.jj<br /> 3.1、声明QueryParser类<br />在QueryParser.jj文件中,PARSER_BEGIN(QueryParser)和PARSER_END(QueryParser)之间,定义了QueryParser类。<br />其中最重要的一个函数是public Query parse(String query)函数,也即我们解析Lucene查询语法的时候调用的函数。<br />这是一个纯Java代码定义的函数,会直接拷贝到QueryPar转载 2010-12-23 14:10:00 · 1105 阅读 · 1 评论 -
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1)
<br />一、Lucene的查询语法<br />Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html(1) 语法关键字<br />+ - && || ! ( ) { } [ ] ^ " ~ * ? : /<br />如果所要查询的查询词中本身包含关键字,则需要用/进行转义(2) 查询词(Term)<br />Lucene支持两种查询词,一种是单一查询词,如"hello",一种是词组(phrase),如"hell转载 2010-12-23 14:09:00 · 749 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(7)
<br />2.4、搜索查询对象<br /> <br /><br />2.4.3.2、并集DisjunctionSumScorer(A OR B)<br />DisjunctionSumScorer中有成员变量List<Scorer> subScorers,是一个Scorer的链表,每一项代表一个倒排表,DisjunctionSumScorer就是对这些倒排表取并集,然后将并集中的文档号在nextDoc()函数中依次返回。<br />DisjunctionSumScorer还有一个成员变量minimumNr转载 2010-12-23 14:06:00 · 857 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(6)
<br />2.4、搜索查询对象<br /> 2.4.3、进行倒排表合并<br />在得到了Scorer对象树以及SumScorer对象树后,便是倒排表的合并以及打分计算的过程。<br />合并倒排表在此节中进行分析,而Scorer对象树来进行打分的计算则在下一节分析。<br />BooleanScorer2.score(Collector) 代码如下:<br />public void score(Collector collector) throws IOException {<br /> colle转载 2010-12-23 14:03:00 · 562 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(4)
<br />2.4、搜索查询对象<br /> 2.4.1.2、创建Weight对象树<br />BooleanQuery.createWeight(Searcher) 最终返回return new BooleanWeight(searcher),BooleanWeight构造函数的具体实现如下:<br /> <br />public BooleanWeight(Searcher searcher) {<br /> this.similarity = getSimilarity(searcher);<br转载 2010-12-23 14:00:00 · 729 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(2)
<br />二、Lucene搜索详细过程<br />为了解析Lucene对索引文件搜索的过程,预先写入索引了如下几个文件:<br />file01.txt: apple apples cat dog<br />file02.txt: apple boy cat category<br />file03.txt: apply dog eat etc<br />file04.txt: apply cat foods2.1、打开IndexReader指向索引文件夹<br />代码为:<br />IndexRead转载 2010-12-23 13:57:00 · 546 阅读 · 0 评论 -
Lucene学习总结之七:Lucene搜索过程解析(1)
<br />一、Lucene搜索过程总论<br />搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程。<br />其可用如下图示:<br /><br /> <br />总共包括以下几个过程:IndexReader打开索引文件,读取并打开指向索引文件的流。用户输入查询语句将查询语句转换为查询对象Query对象树构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部转载 2010-12-23 13:57:00 · 583 阅读 · 0 评论 -
如何提高和优化Lucene搜索速度
这篇文章主要介绍了如何提高Lucene的搜索速度。介绍的大部分思路都是很容易尝试的,当然另外一部分可能会加大你程序的复杂度。所以请确认搜索速度确实很慢,而且很慢的原因确实是因为Lucene自身而造成的。推荐姐妹篇:如何提高和优化Lucene索引速度确认你在使用Lucene的最新版本尽量使用本地文件系统远程文件系统一般来说都会降低搜索速度。如果索引必须分布在远程服务器,可以尝试将远程文件系统设置为只读。在某些情况下,这样可以提高性能。使用更快的硬件设备,特别是更快的IO设备Lucene搜索可以很好的工作在基于翻译 2011-01-10 17:15:00 · 3193 阅读 · 0 评论