修改Similarity(相似度计算)<o:p></o:p>
DefaultSimilarity基本上可以满足一般的搜索要求。但是在有些应用中,你可以定制你自己的Similarity来服务你自己的应用需求。例如:有些人认为没有必要让文档短的文章得分更高一点 (参考 a "fair" similarity).<o:p></o:p>
修改Similarity需要同时对索引和搜索都进行修改,必须在搜索或者排序之间修改Similarity。
要定制你自己的Similarity,也就是你不想直接使用DefaultSimilarity,你只要在建立索引的之前调用IndexWriter.setSimilarity,或者在搜索之前调用Searcher.setSimilarity.
你如果想知道,别人都是怎么修改similarity的,你可以参考一下Lucene的邮件列表Overriding Similarity. 总的来说有下面这些修改:
- SweetSpotSimilarity -- SweetSpotSimilarity gives small increases as the frequency increases a small amount and then greater increases when you hit the "sweet spot", i.e. where you think the frequency of terms is more significant.
- Overriding tf -- In some applications, it doesn't matter what the score of a document is as long as a matching term occurs. In these cases people have overridden Similarity to return 1 from the tf() method.
- Changing Length Normalization -- By overriding lengthNorm, it is possible to discount how the length of a field contributes to a score. In DefaultSimilarity, lengthNorm = 1 / (numTerms in field)^0.5, but if one changes this to be 1 / (numTerms in field), all fields will be treated "fairly".
因为你对你自己的数据更了解,所以你有必要重写自己的Similarity方法。<o:p></o:p>
定制你自己的评分系统(专家级)<o:p></o:p>
修改评分系统是专家级的工作,所以你要谨慎工作,随时和别人交流。在Lucene中,修改评分系统将比修改similarity更加能够影响结果。Lucene的评分系统是一个非常复杂的机制,主要由下面三个类来实现: <o:p></o:p>
- Query -- The abstract object representation of the user's information need.
- Weight -- The internal interface representation of the user's Query, so that Query objects may be reused.
- Scorer -- An abstract class containing common functionality for scoring. Provides both scoring and explanation capabilities.
下面我来具体介绍一下这三个类:
The Query Class<o:p></o:p>
从某种意义上来说,Query是评分开始的地方。没有查询就没有什么可以评分的。更重要的是它是其他的评分系统的催化剂,由它来生成其他的评分系统,然后将他们整合起来。Query有一些重要的方法需要被继承:
- createWeight(Searcher searcher) -- A Weight is the internal representation of the Query, so each Query implementation must provide an implementation of Weight. See the subsection on The Weight Interface below for details on implementing the Weight interface.
- rewrite(IndexReader reader) -- Rewrites queries into primitive queries. Primitive queries are: TermQuery, BooleanQuery, OTHERS????
The Weight Interface<o:p></o:p>
Weight 接口<o:p></o:p>
权重接口主要用来定义Query的一个代表实现接口,所以可以被重用。任何可以用来被搜索的类都应该内置一个Weight,而不是在Query类。这个接口定义了6个要被执行的方法:
- Weight#getQuery() -- Pointer to the Query that this Weight represents.
- Weight#getValue() -- The weight for this Query. For example, the TermQuery.TermWeight value is equal to the idf^2 * boost * queryNorm
- Weight#sumOfSquaredWeights() -- The sum of squared weights. Tor TermQuery, this is (idf * boost)^2
- Weight#normalize(float) -- Determine the query normalization factor. The query normalization may allow for comparing scores between queries.
- Weight#scorer(IndexReader) -- Construct a new Scorer for this Weight. See The Scorer Class below for help defining a Scorer. As the name implies, the Scorer is responsible for doing the actual scoring of documents given the Query.
- Weight#explain(IndexReader, int) -- Provide a means for explaining why a given document was scored the way it was.
The Scorer Class<o:p></o:p>
评分类:<o:p></o:p>
Scorer是评分的抽象类,提供一些基本的计分功能供所有的评分类实现,是Lucene评分机制的核心类。Scorer定义了一下的方法,必须被实现。:
- Scorer#next() -- Advances to the next document that matches this Query, returning true if and only if there is another document that matches.
- Scorer#doc() -- Returns the id of the Document that contains the match. Is not valid until next() has been called at least once.
- Scorer#score() -- Return the score of the current document. This value can be determined in any appropriate way for an application. For instance, the TermScorer returns the tf * Weight.getValue() * fieldNorm.
- Scorer#skipTo(int) -- Skip ahead in the document matches to the document whose id is greater than or equal to the passed in value. In many instances, skipTo can be implemented more efficiently than simply looping through all the matching documents until the target document is identified.
- Scorer#explain(int) -- Provides details on why the score came about.
分享到:
相关推荐
4. **文档评分**:Luck 显示每个匹配文档的评分,这是 Lucene 排序算法的结果,展示了文档与查询的相关性。 5. **元数据查看**:用户可以查看索引的元数据,如文档总数、字段列表、分段信息等,这些信息对于分析...
本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...
6. **更新与删除**:Lucene支持动态索引更新,可以添加、修改或删除文档,并实时反映在搜索结果中。 7. **多字段搜索**:Lucene允许在多个字段上同时进行搜索,可以通过FieldSelector选择参与搜索的字段。 8. **...
这两个库通常用于Lucene的类加载和修改,特别是在运行时动态生成搜索相关的类。 在使用这些jar包构建基于Lucene 5的搜索应用时,需要注意的是,虽然Lucene 5已经更新,但有一些未更新的jar包可能仍然依赖于之前的...
查询执行阶段,Lucene会使用倒排索引快速找到匹配的文档,并根据查询权重对结果进行排序。 4. **优化与更新** Lucene支持增量索引,意味着可以对新的或已更改的数据进行实时更新。索引优化则是一次性合并多个段...
3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新修改。 五、总结 Lucene 3.6作为一款强大的全文搜索库,提供了完整的搜索解决方案,包括高效的索引构建、灵活的查询语法和...
这个库是开源的,由Apache软件基金会维护,遵循Apache许可证,允许开发人员自由使用和修改代码。 Lucene.Net的主要目标是提供高性能、可扩展和易于集成的全文检索能力。它允许开发者在应用程序中实现复杂的搜索算法...
4. **排序与评分**:Lucene不仅可以找到匹配的文档,还能根据相关性对结果进行排序。相关性通常基于TF-IDF算法计算,也可以自定义评分函数。 5. **优化与更新**:Lucene提供优化(Optimize)操作来合并索引段,提高...
- **评分和排序**:Lucene使用TF-IDF算法计算文档与查询的相关性,用于确定搜索结果的排序。 - **更新和删除**:使用IndexWriter可以更新已有文档,或通过ID删除文档。 - **多线程索引**:通过控制IndexWriter的...
3. **评分与排序**:Lucene 使用 TF-IDF(Term Frequency-Inverse Document Frequency)算法对匹配结果进行评分,根据评分进行排序,确保最相关的文档首先展示给用户。 4. **内存和磁盘索引**:Lucene 的索引既可以...
Lucene 2.9.4支持动态更新和删除文档,但需要注意的是,这通常涉及重新创建或更新索引的部分,而非即时修改。 8. **性能优化** Lucene 2.9.4版本在内存管理和磁盘I/O方面做了大量优化,如分块索引、位向量压缩等...
6. **搜索器(Searcher)**: 搜索器执行查询,根据索引返回匹配的文档,并根据评分(relevancy score)排序。 **Lucene 示例与 Demo** "lucene示例"通常包含了演示如何使用 Lucene 的代码片段或完整的应用。这些...
Lucene提供了一些API,如IndexWriter,可以方便地对已有的索引进行修改。 7. **分布式搜索**:对于大型JavaEE项目,单台服务器可能无法满足性能需求,这时我们可以采用Solr或Elasticsearch等基于Lucene的分布式搜索...
6. **实时搜索与更新**:Lucene支持实时索引,即在添加或修改文档后无需重新构建整个索引,即可进行搜索。这通过In-memory缓冲和段合并策略实现。 7. **多语言支持**:Lucene内置了多种语言的分析器,如英文的...
Lucene的核心功能包括文档索引、查询解析、评分和结果排序。在2.3.0版本中,这些功能得到了进一步增强,提升了性能和稳定性。源码分析是理解Lucene工作原理的关键,通过阅读源码,我们可以了解其内部数据结构、算法...
9. **分数(Scoring)**: Lucene根据文档的相关性计算每个匹配文档的得分,用于排序结果。 ### 定制搜索引擎 通过研究和理解Lucene的源码,开发者可以针对特定需求进行定制: 1. **自定义分析器**: 根据应用领域...
- **扩展 Lucene 功能**:指导读者如何通过编写插件或修改核心代码来扩展 Lucene 的功能。 #### 知识点五:Lucene 社区贡献者经验分享 本书的作者团队包括 Michael McCandless、Erik Hatcher 和 Otis Gospodnetić...
同时,通过评分机制,Lucene.Net可以对搜索结果进行排序,使最相关的文档优先展示。 除此之外,Lucene.Net.dll还包含了高效的更新和删除策略。当需要更新已索引的文档或者删除不再需要的记录时,Lucene.Net提供了一...
- **搜索结果排序**: Lucene 支持对搜索结果进行排序,可以通过文档的相关性(TF-IDF)或者其他自定义的评分函数进行排序。 - **分词和分析**: Lucene 内置了多种语言的分词器和分析器,可以处理不同语言的文本,...
Lucene.Net的核心特性包括分词、索引构建、查询解析、文档检索和结果排序等,这些功能都是为了实现高效的全文搜索。 1. **分词**: 分词是搜索引擎的第一步,它将输入的文本拆分成可搜索的词语。Lucene.Net提供了...