`

lucene2.4源码学习7 构建查询树 rewrite

 
阅读更多
搜索结果的排序需要搜索得分的计算,计算得分与查询条件有关。所以第一步就是构建查询条件。
源码中的Weight 就是计算得分的方法,这个是依赖查询条件的构建的。
  public Weight weight(Searcher searcher)
    throws IOException {
    Query query = searcher.rewrite(this);
    Weight weight = query.createWeight(searcher);
    float sum = weight.sumOfSquaredWeights();
    float norm = getSimilarity(searcher).queryNorm(sum);
    weight.normalize(norm);
    return weight;
  }


查询条件的构建是有rewrite来实现的。

 public Query rewrite(Query original) throws IOException {
    Query query = original;
    for (Query rewrittenQuery = query.rewrite(reader); rewrittenQuery != query;
         rewrittenQuery = query.rewrite(reader)) {
      query = rewrittenQuery;
    }
    return query;
  }


这是一个递归,也就是一个查询树,查询条件 子查询条件,继续子查询条件。

最重要的两个查询:BooleanQuery和TermQuery,我们来看看他们的rewrite

BooleanQuery:

 public Query rewrite(IndexReader reader) throws IOException {
    if (minNrShouldMatch == 0 && clauses.size() == 1) {                    // optimize 1-clause queries
      BooleanClause c = (BooleanClause)clauses.get(0);
      if (!c.isProhibited()) {			  // just return clause

        Query query = c.getQuery().rewrite(reader);    // rewrite first

        if (getBoost() != 1.0f) {                 // incorporate boost
          if (query == c.getQuery())                   // if rewrite was no-op
            query = (Query)query.clone();         // then clone before boost
          query.setBoost(getBoost() * query.getBoost());
        }

        return query;
      }
    }


注意
 query.setBoost(getBoost() * query.getBoost());

在BooleanQuery中是把query的boost set进去了的。


TermQuery:
 public Query rewrite(IndexReader reader) throws IOException {
    return this;
  }

TermQuery的就很简单了,就是返回自己。
1
0
分享到:
评论
2 楼 huangyunbin 2013-05-12  
fengyuan1314 写道
能不能直接来个Lucene4.3......

嗯 过段时间吧。其实核心的东西一直没怎么变,后面的是丰富了功能,当然lucene的代码重构也是比较厉害的。
1 楼 fengyuan1314 2013-05-12  
能不能直接来个Lucene4.3......

相关推荐

    庖丁解牛 源码 for Lucene 2.4

    通过对Paoding Lucene的源码学习,开发者可以了解到如何在Lucene的基础上定制适合中文环境的搜索引擎,理解其内部的分词策略、索引构建过程以及查询优化技术。这对于从事Java搜索引擎开发或者希望提升中文搜索质量的...

    Lucene2.4入门总结

    **Lucene 2.4 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件...随着对 Lucene 更深入的学习,你将能够探索更多的高级特性,如近实时搜索、分布式索引和更复杂的查询语法,以满足更复杂的应用场景。

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    然后,我们可以使用Lucene的QueryParser来构建查询,查询可以基于一个或多个关键词。执行查询时,QueryParser会生成对应的Query对象,之后通过IndexSearcher的search方法,在索引中查找匹配的文档。 最后,我们从...

    Lucene 2.4 入门例子

    在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和如何构建一个基本的搜索系统。 ### 一、Lucene 2.4 的改进与性能提升 在Lucene 2.4版本中,主要的改动和性能提升包括: 1. **优化索引构建速度**:...

    java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)

    【标题】"java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)" 涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene ...

    lucene 2.4 jar

    lucene 2.4 jar lucene2.4版本的JAR包

    ictclas4j for lucene 2.4

    ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0

    Lucene2.4完美样例+中文文档

    **Lucene 2.4 完美样例与中文文档详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它为开发者提供了在 Java 应用程序中实现全文检索功能的强大工具。Lucene 2.4 版本是其历史上的一个重要...

    Lucene学习源码.rar

    通过学习Lucene源码,我们可以定制自己的分词器、查询解析器,甚至优化搜索算法,以满足特定的搜索需求。例如,在中文环境下,可以使用IK Analyzer或者jieba分词库来增强对中文的支持。 总结,Lucene作为Java平台上...

    lucene3源码分析

    - **语法分析**:构建查询语句的语法树。 - **语言处理**:处理查询语句,使其适合于搜索操作。 - **第三步:搜索索引**。 - **第四步:结果排序**。计算查询与文档的相关性得分,并按照得分高低对结果进行排序。 ...

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0产品搜索

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Lucene2.4.1

    同时,通过运行demos包中的示例,你可以直观地看到Lucene如何处理各种场景,如文本分析、索引构建、查询执行等。这些示例不仅提供了学习素材,也为你实际项目中的应用提供了参考。 总结来说,Lucene 2.4.1是搜索...

    Lucene_2.4.CHM

    lucene2.4手册,是开发搜索引擎的好帮手.

    lucene5.0源码包

    《深入剖析Lucene 5.0源码》 Lucene是一个高性能、全文检索库,它为Java开发者提供了在应用程序中实现全文检索功能的工具。在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好...

    lucene.net 2.9.1 源码

    《深入剖析Lucene.NET 2.9.1:源码解析与应用...总结,Lucene.NET 2.9.1的源码不仅是一份学习资料,也是实践中的宝贵工具。深入理解其工作机制,将有助于提升.NET平台上的搜索技术能力,实现高效、精准的全文检索功能。

    lucene5 源码教程

    总结,Lucene 5为开发者提供了强大且灵活的全文检索功能,通过深入学习其源码,尤其是拼音检索和分词器的运用,可以有效地提升搜索质量和用户体验。不断探索和实践,才能充分挖掘Lucene的潜力,为各种信息检索应用...

    Lucene.net源码及中文文档

    通过阅读和理解Lucene.NET的源代码,开发者可以深入学习其内部工作原理,如倒排索引的构建、查询解析的逻辑以及匹配算法等。这对于自定义扩展和优化搜索引擎功能至关重要。 总的来说,Lucene.NET是一个强大的全文...

    Lucene.net3.0+PanGu2.4.zip

    支持net4.0环境下运行,Lucene.net版本为3.0,PanGu版本为2.4

Global site tag (gtag.js) - Google Analytics