搜索结果的排序需要搜索得分的计算,计算得分与查询条件有关。所以第一步就是构建查询条件。
源码中的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的就很简单了,就是返回自己。
分享到:
相关推荐
通过对Paoding Lucene的源码学习,开发者可以了解到如何在Lucene的基础上定制适合中文环境的搜索引擎,理解其内部的分词策略、索引构建过程以及查询优化技术。这对于从事Java搜索引擎开发或者希望提升中文搜索质量的...
**Lucene 2.4 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件...随着对 Lucene 更深入的学习,你将能够探索更多的高级特性,如近实时搜索、分布式索引和更复杂的查询语法,以满足更复杂的应用场景。
然后,我们可以使用Lucene的QueryParser来构建查询,查询可以基于一个或多个关键词。执行查询时,QueryParser会生成对应的Query对象,之后通过IndexSearcher的search方法,在索引中查找匹配的文档。 最后,我们从...
在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和如何构建一个基本的搜索系统。 ### 一、Lucene 2.4 的改进与性能提升 在Lucene 2.4版本中,主要的改动和性能提升包括: 1. **优化索引构建速度**:...
【标题】"java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)" 涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene ...
lucene 2.4 jar lucene2.4版本的JAR包
ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0
**Lucene 2.4 完美样例与中文文档详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它为开发者提供了在 Java 应用程序中实现全文检索功能的强大工具。Lucene 2.4 版本是其历史上的一个重要...
通过学习Lucene源码,我们可以定制自己的分词器、查询解析器,甚至优化搜索算法,以满足特定的搜索需求。例如,在中文环境下,可以使用IK Analyzer或者jieba分词库来增强对中文的支持。 总结,Lucene作为Java平台上...
- **语法分析**:构建查询语句的语法树。 - **语言处理**:处理查询语句,使其适合于搜索操作。 - **第三步:搜索索引**。 - **第四步:结果排序**。计算查询与文档的相关性得分,并按照得分高低对结果进行排序。 ...
struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
同时,通过运行demos包中的示例,你可以直观地看到Lucene如何处理各种场景,如文本分析、索引构建、查询执行等。这些示例不仅提供了学习素材,也为你实际项目中的应用提供了参考。 总结来说,Lucene 2.4.1是搜索...
lucene2.4手册,是开发搜索引擎的好帮手.
《深入剖析Lucene 5.0源码》 Lucene是一个高性能、全文检索库,它为Java开发者提供了在应用程序中实现全文检索功能的工具。在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好...
《深入剖析Lucene.NET 2.9.1:源码解析与应用...总结,Lucene.NET 2.9.1的源码不仅是一份学习资料,也是实践中的宝贵工具。深入理解其工作机制,将有助于提升.NET平台上的搜索技术能力,实现高效、精准的全文检索功能。
总结,Lucene 5为开发者提供了强大且灵活的全文检索功能,通过深入学习其源码,尤其是拼音检索和分词器的运用,可以有效地提升搜索质量和用户体验。不断探索和实践,才能充分挖掘Lucene的潜力,为各种信息检索应用...
通过阅读和理解Lucene.NET的源代码,开发者可以深入学习其内部工作原理,如倒排索引的构建、查询解析的逻辑以及匹配算法等。这对于自定义扩展和优化搜索引擎功能至关重要。 总的来说,Lucene.NET是一个强大的全文...
支持net4.0环境下运行,Lucene.net版本为3.0,PanGu版本为2.4