- 浏览: 79579 次
- 性别:
- 来自: 江西
最新评论
-
115646002:
我请问个问题:
我在配置eclipse3.6的时候,应该是某一 ...
eclipse 3.6 Helios 最新插件 -
xangqun:
是啊,不过真的很好用
tomcat插件与Jrebel插件整合(java web开发利器) -
freecode:
jrebel收费吧
tomcat插件与Jrebel插件整合(java web开发利器) -
lydawen:
开发js相当不错的插件 aptana - http://upd ...
eclipse3.5 Galileo最新实用插件 -
hszhl:
eclipse{wtp+cdt+ve#/windowBuild ...
eclipse3.5 Galileo最新实用插件
2.4、搜索查询对象
2.4.1.2、创建Weight对象树
BooleanQuery.createWeight(Searcher) 最终返回return new BooleanWeight(searcher),BooleanWeight构造函数的具体实现如下:
public BooleanWeight(Searcher searcher) { this.similarity = getSimilarity(searcher); weights = new ArrayList<Weight>(clauses.size()); //也是一个递归的过程,沿着新的Query对象树一直到叶子节点 for (int i = 0 ; i < clauses.size(); i++) { weights.add(clauses.get(i).getQuery().createWeight(searcher)); } } |
对于TermQuery的叶子节点,其TermQuery.createWeight(Searcher) 返回return new TermWeight(searcher)对象,TermWeight构造函数如下:
public TermWeight(Searcher searcher) { this.similarity = getSimilarity(searcher); //此处计算了idf idfExp = similarity.idfExplain(term, searcher); idf = idfExp.getIdf(); } |
//idf的计算完全符合文档中的公式: public IDFExplanation idfExplain(final Term term, final Searcher searcher) { final int df = searcher.docFreq(term); final int max = searcher.maxDoc(); final float idf = idf(df, max); return new IDFExplanation() { public float getIdf() { return idf; }}; } |
public float idf(int docFreq, int numDocs) { return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0); } |
而ConstantScoreQuery.createWeight(Searcher) 除了创建ConstantScoreQuery.ConstantWeight(searcher)对象外,没有计算idf。
由此创建的Weight对象树如下:
weight BooleanQuery$BooleanWeight (id=169) | | //ConstantScore(contents:apple*) | //contents:boy | | //ConstantScore(contents:cat*) | //contents:dog | | //contents:eat | //contents:cat^0.33333325 //contents:foods |
2.4.1.3、计算Term Weight分数
(1) 首先计算sumOfSquaredWeights
按照公式:
代码如下:
float sum = weight.sumOfSquaredWeights();
//可以看出,也是一个递归的过程 public float sumOfSquaredWeights() throws IOException { float sum = 0.0f; for (int i = 0 ; i < weights.size(); i++) { float s = weights.get(i).sumOfSquaredWeights(); if (!clauses.get(i).isProhibited()) sum += s; } sum *= getBoost() * getBoost(); //乘以query boost return sum ; } |
对于叶子节点TermWeight来讲,其TermQuery$TermWeight.sumOfSquaredWeights()实现如下:
public float sumOfSquaredWeights() { //计算一部分打分,idf*t.getBoost(),将来还会用到。 queryWeight = idf * getBoost(); //计算(idf*t.getBoost())^2 return queryWeight * queryWeight; } |
对于叶子节点ConstantWeight来讲,其ConstantScoreQuery$ConstantWeight.sumOfSquaredWeights() 如下:
public float sumOfSquaredWeights() { //除了用户指定的boost以外,其他都不计算在打分内 queryWeight = getBoost(); return queryWeight * queryWeight; } |
(2) 计算queryNorm
其公式如下:
其代码如下:
public float queryNorm(float sumOfSquaredWeights) { return (float)(1.0 / Math.sqrt(sumOfSquaredWeights)); } |
(3) 将queryNorm算入打分
代码为:
weight.normalize(norm);
//又是一个递归的过程 public void normalize(float norm) { norm *= getBoost(); for (Weight w : weights) { w.normalize(norm); } } |
其叶子节点TermWeight来讲,其TermQuery$TermWeight.normalize(float) 代码如下:
public void normalize(float queryNorm) { this.queryNorm = queryNorm; //原来queryWeight为idf*t.getBoost(),现在为queryNorm*idf*t.getBoost()。 queryWeight *= queryNorm; //打分到此计算了queryNorm*idf*t.getBoost()*idf = queryNorm*idf^2*t.getBoost()部分。 value = queryWeight * idf; } |
我们知道,Lucene的打分公式整体如下,到此计算了图中,红色的部分:
发表评论
-
Lucene学习总结之十:Lucene的分词器Analyzer(转)
2010-06-08 11:31 13601、抽象类Analyzer 其主要包含两个接口,用于生成To ... -
Lucene学习总结之九:Lucene的查询对象(3)转
2010-06-08 11:30 8746、FilteredQuery FilteredQue ... -
Lucene学习总结之九:Lucene的查询对象(2)转
2010-06-08 11:29 8595、SpanQuery 所谓SpanQuery也即在查询过 ... -
Lucene学习总结之九:Lucene的查询对象(1)转
2010-06-08 11:27 985Lucene除了支持查询语法以外,还可以自己构造查询 ... -
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(2)转
2010-06-08 11:25 887三、解析QueryParser.jj 3.1、声明Qu ... -
Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1)转
2010-06-08 11:24 1050一、Lucene的查询语法 Lucene所支持的查询语法可见 ... -
Lucene学习总结之七:Lucene搜索过程解析(8)转
2010-06-08 11:22 9122.4、搜索查询对象 2.4.4、收集文档结 ... -
Lucene学习总结之七:Lucene搜索过程解析(7)转
2010-06-08 11:20 9792.4、搜索查询对象 2.4.3.2、并集Di ... -
Lucene学习总结之七:Lucene搜索过程解析(6)转
2010-06-08 11:20 14702.4、搜索查询对象 2.4.3、进行倒排表合并 ... -
Lucene学习总结之七:Lucene搜索过程解析(5)转
2010-06-08 11:19 10202.4、搜索查询对象 2.4.2、创建Sco ... -
Lucene学习总结之七:Lucene搜索过程解析(3)转
2010-06-08 11:17 10512.3、QueryParser解析查询语句生成查询对象 ... -
Lucene学习总结之七:Lucene搜索过程解析(2)转
2010-06-08 11:16 845二、Lucene搜索详细过程 为了解析Lucene对索引文件 ... -
Lucene学习总结之七:Lucene搜索过程解析(1)转
2010-06-08 11:15 886一、Lucene搜索过程总论 搜索的过程总的来说就是将词典及 ... -
Lucene学习总结之六:Lucene打分公式的数学推导(转)
2010-06-08 11:13 921在进行Lucene的搜索过程 ... -
Lucene学习总结之五:Lucene段合并(merge)过程分析(转)
2010-06-08 11:12 1067一、段合并过程总论 IndexWriter中与段合并有关的成 ... -
Lucene学习总结之四:Lucene索引过程分析(4)转
2010-06-08 11:08 7416、关闭IndexWriter对象 代码: writ ... -
Lucene学习总结之四:Lucene索引过程分析(3)转
2010-06-08 11:07 8545、DocumentsWriter对CharBlockPool ... -
Lucene学习总结之四:Lucene索引过程分析(2)转
2010-06-08 11:06 7763、将文档加入IndexWriter 代码: write ... -
Lucene学习总结之四:Lucene索引过程分析(1)转
2010-06-08 11:05 783对于Lucene的索引过程,除了将词(Term)写入倒排表并最 ... -
Lucene学习总结之三:Lucene的索引文件格式 (3)转
2010-06-08 11:02 881四、具体格式 4.2. 反向信息 反向信息是索引文件的 ...
相关推荐
1.15 Lucene学习总结之七:Lucene搜索过程解析(4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246 1.16 Lucene学习总结之七:Lucene搜索过程解析(5) . . . . . . . . . . . . ....
官网的lucene全文检索引擎工具包,下载后直接解压缩即可使用
由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本
Lucene查询解析器 Lucene查询字符串解析器,用作Web api查询或过滤器字符串。 基本代码来自 使用这种语言的示例查询: name: apple price: > 100 price: > 100 AND active: = 1 product.price: > 100 AND ...
lucene-搜索过程源码解析-Score树
lucene搜索端uml时序图,lucene源码解析 图比较大,看不清,可以下载【sd-search.svg】后再用浏览器打开 使用starUML画图,可以下载【lucene.mdj】后打开,编辑 前提 只考虑最简单的查询,比如只对一个字段,用一个...
本文并给出一个经典的lucene全文收索例子代码。该例子功能是从磁盘文档建立索引,搜索该文档中的哪个TXT文件包含所搜索内容。最后再大致介绍Lucene的结构模块,应用流程希望对网友能有帮助。
----使用iText解析PDF 文档代码 PDFBoxHello.java ----------- --PDFBox测试代码 PDFBoxLuceneIndex.java ------ --PDFBox创建PDF文件的Lucene索引 PDFBoxPathIndex.java ------- --PDFBox创建指定目录PDF文档...
Lucene搜索过程的核心类 IndexSearcher:用于搜索IndexWriter创建的索引 Term:用于搜索的一个基本单元包括了一对字符串元素,与Field相对应 Query :抽象的查询类 TermQuery:最基本的查询类型,用来匹配特定Field...
Lucene搜索引擎开发权威经典 光盘 于天恩 著 中国铁道出版社出版 2008-10 这本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精练简洁,恰到好处。 本书共包括16章,...
lucene-搜索过程源码解析-1-Weight生成.txt
详细分析lucene搜索的实现过程,通过代码解析,会对lucene的搜索实现过程有一个更加深刻的认识
Eclipse工程/ch7:原书第七章和第九章的Eclipse工程文件 使用PDFBox解析PDF文件 使用xpdf解析中文PDF文件 使用POI解析WORD和Excel文件 使用Jacob解析WORD文件 Google的Search API的使用 安装:直接在Eclipse中...
描述了Lucene中如何使用FST算法构建term的内存索引,使用了很多图,直观的展现了FST图的构建流程,能够对想了解lucene内部实现机制原理的同学有帮助。
Eclipse工程/ch7:原书第七章和第九章的Eclipse工程文件 使用PDFBox解析PDF文件 使用xpdf解析中文PDF文件 使用POI解析WORD和Excel文件 使用Jacob解析WORD文件 Google的Search API的使用 安装:直接在Eclipse中...
Lucene 是一个开源、高度可扩展的搜索引擎库,可以从 Apache Software Foundation 获取。您可以将 Lucene 用于商业和开源应用程序。Lucene 强大的 API 主要关注文本索引和搜索。它可以用于为各种应用程序构建搜索...
开源全文搜索工具包Lucene2.9.1的使用。 1. 搭建Lucene的开发环境:在classpath中添加lucene-core-2.9.1.jar包 2. 全文搜索的两个工作: 建立索引文件,搜索索引. 3. Lucene的索引文件逻辑结构 1) 索引(Index)由...
解析,修改和字符串化Lucene查询。 | | 安装 npm install --save lucene -or- yarn add lucene 用法 const lucene = require ( 'lucene' ) ; const ast = lucene . parse ( 'name:frank OR job:engineer' ) ; ...
这是一篇公司的内部培训教材,其中中的内容涵盖LUCENE的方方面面,从源代码角度深入剖析LUCENE,如果要对LUCENE有更加深入的了解(专家级别),这篇技术文档必不可少。 前提:对LUCENE有一定程度的了解,否则会让你云...
FileReaderAll函数用来从文件中读取字符串,默认编码为“GBK”。在创建完最重要的IndexWriter之后,就开始遍历需要索引的文件,构造对应的Document和Filed类,最终通过IndexWriter的addDocument函数开始索引。...