`
suichangkele
  • 浏览: 198164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene3.0.3中的DidjunctionMaxQuery

阅读更多

       solr中的dismax我在lucene中一直没有找到对应的queryParser,但是我倒是找到了一个Query——DisjunctionMaxQuery,他的原理和disMax的原理是一样的。我仔细想了想,solr中的dismax这个queryParser的最终也是形成了一个类似的query,当然其实现可能不同,大致原理应该一样。所以我看了看lucene 3.0.3中的DisjunctionMaxQuery类的源码,再此记录一下笔记,方便我,也方便你。

        DisjunctionMaxQuery,以下简称dmq,和booleanQuery的原理是差不多的,他也是含有多个subQuery,但是如同它的名字一样,是对多个subQuery取并集(他没有minNrShouldMatch的要求,只要某一个subQuery召回了某个doc,这个doc就会被最终召回),与booleanQuery最大的不同是在得分上(我稍后会补充下booleanQuery的得分实现)。

       它的打分公式是:召回当前doc的多个subScorer(并不是全部的subScorer,因为可能有的subScorer可能不会召回这个doc)的得分相加,获得sum,同时记录所有的召回当前doc的subScorer中最大的得分max,最后某个doc的得分是

max + (sum - max) * tieBreakerMultiplier;

在源代码中,他是用数组来保存的,原因很简单,数组是引用类型,在递归中不用重新设置新的值,就能保存上一层递归的值。从他的打分来看,他会优先使用最大的匹配的query,但是对于那些非最大的匹配的query,并不是完全的忽略,而是使用将其得分乘以一个很小的系数,也就是这里的tieBreaderMultiplier,在solr的disMax 的queryParser里面也有这样的一个属性,叫做tie,他们应该是相同的意思。

      我们来思考一下在百度中进行搜索的时候,比如我们搜索一个人名,比如“科比”,我们假设百度在对“科比“进行分词的时候是分为”科比“这一个词(而不是分为 ”科“、”比“),我们得到的第一个排名是科比的百度百科,如果我们把整个html的内容作为一个域的话,按照tf idf的算法,百度百科不可能永远排在第一位,所以html的所有的内容应该不是完全相同的一个域(类似于在solr的copyField,虽然可以把很多的域复制到同一个域中,但是这样就会丢失不同的域的权重),百度的做法应该是和这里的DisjunctionMaxQuery的思想是一样的,在搜科比的时候会搜多个域,比如存在两个域,title和body,title中的字符更少,他的权重更高一些,在body中存在更多的term,所以这个与的权重低一些,我们在搜”科比“的时候,会形成一个DisjunctionMaxQuery,它包含两个子query,title:科比  和 body:科比。使用这个DisjunctionMaxQuery的得分正好匹配了百度的做法,尽管body:科比匹配了众多的网页,但是他的权重很低,而title:科比值匹配了很少量的网页,并且他的权重更高得分也更高,所以百度百科排在前面也就能明白了。

      DisjunctionMaxQuery看来也很适合做电商的搜索,我们在搜一个词的时候,可能在商品的标题、类别、品牌、描述中都会被搜到,但是明显他们的重要性不一样,所以我们可以使用这个query来进行搜索,来实现更准确的搜索效果。

 

 

 

 

分享到:
评论

相关推荐

    lucene-3.0.3-src.zip

    3. **搜索优化**:Lucene 3.0.3的源码中,可以看到对Boosting、Filtering和Sorting等高级搜索功能的实现,以及对TopDocs排序算法的优化。 四、实战应用 了解了Lucene的内部机制后,我们可以根据实际项目需求,结合...

    lucene3.0.3搜索的使用示例

    这个"lucene3.0.3搜索的使用示例"压缩包文件很可能是为了帮助用户理解并学习如何在项目中应用Lucene 3.0.3版本的功能。 在Lucene 3.0.3中,主要包含了以下核心概念和知识点: 1. **索引(Indexing)**:这是Lucene...

    盘古分词、lucene3.0.3搜索的使用示例v1.3.zip

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在文本处理和信息检索领域中至关重要的工具。盘古分词,作为一款优秀的中文分词系统,能够高效准确地对中文文本进行分词,为后续的数据...

    Lucene3.0.3+盘古分词 资源汇总

    《Lucene3.0.3与盘古分词:打造高效搜索引擎》 在信息技术日新月异的时代,搜索引擎已经成为我们获取信息的重要工具。Lucene,作为Apache软件基金会的一个开源项目,是Java语言实现的全文检索引擎库,为开发者提供...

    盘古分词、lucene3.0.3搜索的使用示例v1.2

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在中文信息处理领域广泛应用的工具,本示例将详细介绍如何在.NET 4.0环境中整合这两个组件,以实现高效的全文搜索功能,并新增了分页功能...

    盘古分词、lucene3.0.3搜索的使用示例.zip

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在文本处理和全文检索领域中至关重要的工具。本文将深入探讨如何在.NET 4.0环境中集成并使用这两个组件,以实现高效的文本分析和搜索引擎...

    Lucene3.0.3+盘古分词(证实可用,可指定使用自己的词库文件).rar

    在“Lucene3.0.3+盘古分词(证实可用,可指定使用自己的词库文件).rar”这个压缩包中,包含了实现这一功能所需的DLL文件和词库文件,这使得开发者可以轻松地在自己的项目中集成这一功能。 首先,我们要明白Lucene ...

    lucene 3.0.3.core.jar

    lucene3.0.3.core.jar文件,不用到apache官方网站下载17M的包,直接下载这个core就可以了。

    Lucene 3.0.3 API

    在 Lucene 3.0.3 版本中,我们看到了一系列重要的特性和改进,这些都极大地提升了其性能和易用性。 1. **索引过程**:Lucene 的索引过程涉及到将文档内容转换为倒排索引,这是一种高效的存储和检索方式。在 3.0.3 ...

    Lucene3.0分词系统.doc

    以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较于中文来说较为简单,因为英文单词间通常以空格作为天然的分隔符。然而,为了提高搜索效率和准确性,Lucene3.0采用了更...

    lucene-3.0.3.zip

    《Apache Lucene 3.0.3:全文检索与搜索引擎核心技术详解》 Apache Lucene 是一个开源的全文检索库,由Java编写,提供强大的搜索功能。在这个3.0.3版本中,它继续展现了其在信息检索领域的强大性能和灵活性。Lucene...

    Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词)

    这是Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词),用C#语言编写的,同时对PanGu分词进行了整合,可以直接下载运行。 项目中还整理了一个后台任务线程监听范例,可以用作增量索引创建,但这个需要你自行加入相关...

    Lucene.net3.0.3源码

    Apache Lucene.Net 3.0.3 just passed a vote for release - our first official release since graduating from the incubator in August. A lot of work was put into porting and testing the code. We've ...

    Lucene SpellChecker3.0.2

    Lucene SpellChecker for Lucene 3.0.2

    lucene-smartcn-3.0.3.jar

    lucene-smartcn-3.0.3.jar

    Lucene实战(中文版第二版)对应Lucene版本

    此资源对应的是Lucene 3.0.3版本,这是Lucene发展历史中的一个重要里程碑。 在Lucene 3.0.3版本中,包含了以下关键知识点: 1. **索引构建**:Lucene的核心功能之一就是快速构建倒排索引。这个版本中,你可以学习...

    Apache-Lucene.Net-3.0.3-RC2

    Lucene.Net 3.0 最新源码 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于...

    lucene源码和教程

    lucene3.0.3源码和教程

Global site tag (gtag.js) - Google Analytics