lucene中用到的常用算法

在lucene中,使用了很多常用的算法。还有一些很不错的算法,在学习lucene的过程中,顺便把这些算法也纪录下来,以后编程中可以直接使用。

1、在类TermHashPerField类中使用了快速排序:


void quickSort(RawPostingList[] postings, int lo, int hi) {
if (lo >= hi)
return;
else if (hi == 1+lo) {
if (comparePostings(postings[lo], postings[hi]) > 0) {
final RawPostingList tmp = postings[lo];
postings[lo] = postings[hi];
postings[hi] = tmp;
}
return;
}

int mid = (lo + hi) >>> 1;

if (comparePostings(postings[lo], postings[mid]) > 0) {
RawPostingList tmp = postings[lo];
postings[lo] = postings[mid];
postings[mid] = tmp;
}

if (comparePostings(postings[mid], postings[hi]) > 0) {
RawPostingList tmp = postings[mid];
postings[mid] = postings[hi];
postings[hi] = tmp;

if (comparePostings(postings[lo], postings[mid]) > 0) {
RawPostingList tmp2 = postings[lo];
postings[lo] = postings[mid];
postings[mid] = tmp2;
}
}

int left = lo + 1;
int right = hi - 1;

if (left >= right)
return;

RawPostingList partition = postings[mid];

for (; ;) {
while (comparePostings(postings[right], partition) > 0)
--right;

while (left < right && comparePostings(postings[left], partition) <= 0)
++left;

if (left < right) {
RawPostingList tmp = postings[left];
postings[left] = postings[right];
postings[right] = tmp;
--right;
} else {
break;
}
}

quickSort(postings, lo, left);
quickSort(postings, left + 1, hi);
}


2、多个数组求交集
这个是用在query查询的多个term取到倒排表以后,做交集得到结果
ConjunctionScorer.java 的 doNext函数是这个算法的实现,非常的简单,几行代码而已,非常的喜欢这个算法。
scorers[ ] 是以队列为单个元素的数组,首先用这些队列的第一个元素对数组进行排序,从0到length-1从小到大排好,然后将其中最大的scorers[length-1]队列的第一个元素赋于doc。然后每一个队列都与这个最大的doc做比较,如果第一个元素小于doc,那么这个队列弹出下一个元素与doc比较;如果相等,那么first加一,换成下一个队列与doc做比较;如果大于doc,那么将这个元素赋于doc,作为最大的。可以把这个些以队列为元素的数组当作一个环形的数组,这样就比较容易理解了。
firstScorer.advance(doc) 函数advance是从该数组中取大于等于doc号的doc

  private int doNext() throws IOException {
int first = 0;
int doc = scorers[scorers.length - 1].docID();//取最大的doc号给doc
Scorer firstScorer;
while ((firstScorer = scorers[first]).docID() < doc) {
doc = firstScorer.advance(doc);//从first数组中取大于等于doc号的元素,如果当前first大于doc,那么将doc设为当前first的元素

first = first == scorers.length - 1 ? 0 : first + 1;//first加一,如果当前到了length-1,那么相当于一个环形,从0开始
}
return doc;
}
lucene打分机制 最终匹配分值score = 查询语句在N个域中的得分之和 * coord的值 每个域中的得分 = queryWeight * fieldWeight queryWeight = idf * queryNorm * boost fieldWeight = idf * fieldNorm * tf 假设在两个域A,B中查询,那么总结公式 : score = sum( A(queryWeight=idf*queryNorm*boost + fieldWeight=idf*fieldNorm*tf) + 阅读详情

相关推荐

Linux Component概述和高通component的使用

为了让subsystem按照一定顺序初始化设备才提出来的。subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建?

lz_1990的专栏 1583

深入揭秘Lucene:全面解析其原理与应用场景(一)

Lucene是由Doug Cutting于1999年创建的一个全文搜索引擎库。Doug Cutting最初是为了创建一个基于全文搜索的邮件存档系统而开始开发Lucene。在最初的几年里,Lucene主要被用于开发用于搜索和索引大规模文本数据的应用程序。随着Lucene的功能和性能不断提升,它逐渐被广泛应用于各种领域,如搜索引擎、电子商务、知识管理等。2001年,Apache Software Foundation 接管了Lucene项目,并将其作为Apache的开源项目进行维护和发展。

凛鼕将至的博客 2702

ISO IEC 16022-2024.pdf

ISO IEC 16022-2024.pdf

Lucene 算法原理

Lucene的概述:  Lucene(发音为 [‘lusen] )是一个非常优秀的开源的全文搜索引擎,我们可以在它的上面开发出各种全文搜索的应用来。Lucene在国外有很高的知名度,现在已经是Apache的顶级项目,在国内,Lucene的应用也越来越多。Lucene算法原理:  Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下: 0)设有两篇

ayi_5788的专栏 4412

Java轻量级全文检索引擎Lucene使用及优化

Lucene是一个开源的全文检索引擎工具包由Doug Cutting编写。它被设计用于实现全文搜索功能,即读入一堆文本文件并将其转换为易于搜索的数据结构。Lucene提供了一组简单而强大的API,使得索引和搜索过程变得非常方便。

BXA 5735

Lucene的全文检索算法

1. 什么是lucenelucene是apache组织下的一个全文检索引擎工具包, 就是一堆jar包, 放入tomcat下不可以独立运行.2. lucene的作用?优化查询速度, 在海量数据查询的时候, 可以优化查询速度 我们可以使用lucene来构建像百度, 谷歌, 必应这样的全文检索引擎系统3. 应用领域:互联网全文检索引擎: 百度, 谷歌, 必应 站内全文检索引擎: 天猫, 京东的搜索

没有伞的孩子必须努力奔跑!—小林 2852

Solr评分整理汇总:深入理解Lucene默认打分算法以及常用的三种评分方法

Solr评分整理汇总 Solr本身的排序打分规则是继承自Lucene的文本相关度的打分即boost,这一套算法对于通用的提供全文检索的服务来讲,已经够用了,但是想要根据实际业务需求定制自己的打分机制来获取理想的查询结果,文本相关度的打分是远远不够的。 如何来定制实际业务需求的的排序打分规则(boost)呢?暂时得到如下三个方法: 1、熟悉Lucene的打分规则算法,根据自己实际业务需...

十年呵护的专栏 2486

Lucene常用的字段类型&lucene检索打分原理

在 Apache Lucene 中,Field类是文档中存储数据的基础。不同类型的Field用于存储不同类型的数据(如文本、数字、二进制数据等)。以下是一些常用的Field和。

zfj321的博客 1488

Lucene与Tag图

Lucene与Tag图 Tag图是采用了Tag作为文章管理工具的网站经常需要呈现的一种视图。利用Lucene的优异性能,可以出色的完成这一功能。 生成一个Tag图,首先需要知道用于一共使用了哪些Tag,其次需要知道每个Tag被使用的次数。 对于这两个功能,都可以使用Lucene.Index.IndexReader.Terms方法。这个方法返...

weixin_30633507的博客 123

基于Lucene的中文文本分词

王继明,杨国林 (内蒙古工业大学信息工程学院,呼和浩特010051) 摘要:中文文本分词技术是文本挖掘领域的一个重要分支,在中国仍然处于发展阶段.Apache Jakarta的开源工程Lucene是一个十分优秀的基于Java语言的文本检索工具包,在国外已经得到广泛的应用.但是Lucene对中文分词功能的支持不太理想,给Lucene加入好的中文分词功能对Lucene在国内的发展和应用将会起到...

轻轻草原 255

Lucene的工作原理

spy9157的专栏 128

Lucene 得分算法

搜索引擎:Elasticsearch、Solr、Lucene ELK中的ES:Elasticsearch SolrCloud 的搭建、使用 Solr 高亮显示 Spring Data Solr 使用 Solr的安装与配置 Solr 原理、API 使用 Lucene 原理、API使用 Lucene 得分算法 1.示例代码: TextField content = new Text...

あずにゃん梓喵的博客 981

Lucene之MaxScorer算法简介

简介           名叫“Lucene之MaxScorer算法分析”其实并不准确,因为有Stefan提交的MaxScorer代码尚未提交到Lucene,至今还在讨论中,具体见:https://issues.apache.org/jira/browse/LUCENE-4571,他索所要解决的问题就是Lucene在计算Top-k时效率慢的问题。 目前Lucene对于MaxScore的计算,

iTer的专栏 3839

lucene用到的优先队列

jdk有一个java.util.PriorityQueue。lucene中也有个PriorityQueue.为了节约空间和更高效,lucene没有使用jdkp中的PriorityQueue.它们的主要读取方法时间都是的log(n),但也有些不同。下面看看lucene中使用的PriorityQueue。它内部是一个堆排序。java.util.PriorityQueue是一个自增长的优

dknypxt的专栏 1337

Lucene基础排序算法改进

Lucene基础排序算法:score_d = sum_t(tf_q * idf_t / norm_q * tf_d * idf_t / norm_dt_t)score_d: Document(d) 的得分sum_t: Term(t) 的总和tf_q: 查询中 t 的频度的平方根tf_q: d 中 t 的频度的平方根idf_t: log(numDocs/docFreq_t + 1) + 1.0num

天马行空 2373

全文搜索技术—Lucene

Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。

大数据同盟会的博客 1582

Lucene Inverted index(倒排索引)原来快速入门

Lucene是一个高性能的JAVA全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下: 设有两篇文章1和2:文章1的内容为:Tom lives in Guangzhou, I live in Guangzhou too.文章2的内容为:He once lived in Shanghai.  由于lucene是基于关键词索引和查询的,首先我

jackyrongvip的专栏 1015

lucene字典Finite State Transducers(FST)

下面大部分内容转自http://www.cnblogs.com/LBSer/p/4119841.html 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该term所对应的倒排文档id列表等信息。实际上lucene索引文件后缀名为tim和tip的文件实现的就是lucene的字典功能。       怎么实现一个字典呢?我们马上想到排序数组,即term字典是一个...

AAA821的专栏 2561

lucene涉及到的算法----二元搜索算法

<br />转贴。。<br /> <br />二元搜索算法是在排好序的数组中找到特定的元素.<br /> 首先, 比较数组中间的元素,如果相同,则返回此元素的指针,表示找到了. 如果不相同, 此函数就会继续搜索其中大小相符的一半,然后继续下去. 如果剩下的数组长度为0, 则表示找不到,那么函数就会结束.<br /> 此算法函数如下:int *binarySearch(int val, int array[], int n) { int m = n/2; if(n <= 0)

浮夸。 7042
上一篇: java内部类的用法
下一篇: linux 常用命令备忘
eric509
博客等级 码龄19年 8粉丝 170原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值