Refrence
1. 搜索基础知识
Lucene的提供各种Query的实现,其中大部分是在这个包,它的子包(spans,payloads),或queries模块。这些实现可以以广泛的多种方式,以提供复杂的查询功能,以及在何处的匹配发生在文档集合信息进行组合。在第二部分会介绍几个重要的Query Class。如果想实现自己的查询类的,详细信息请参阅后面。
为了执行搜索,应用程序通常调用IndexSearcher.search(query,int) 。
一旦查询已创建并提交IndexSearcher的,评分过程开始。一些基础设置后,最终得分通过Weight 和相应的 Scorer 或者 BulkScore。见第六部分对这一进程更加说明部分。
2. 查询(Query)类
TermQuery
TermQuery tq = new TermQuery(new Term("fieldName", "term"));
该例子会识别所有fieldName领域包含term的Document
BooleanQuery
- SHOULD
- MUST
- MUST NOT
Phrases
。。。
TermRangeQuery
。。。
NumericRangeQuery
。。。
PrefixQuery, WildcardQuery, RegexpQuery
。。。
FuzzyQuery
。。。
3. 评分(Score):简介
Lucene的评分十分快速,而且隐藏了很多复杂的内容。
Lucene的得分支持多种可插拔的信息检索 模型,其中包括:
- 向量空间模型(VSM)
- 概率模型(Okapi BM25和 DFR)
- 语言模型
4. 评分:基础知识
得分是非常依赖于文档索引的方法,索引显得非常重要。
IndexSearcher.explain(Query,int) ,以了解如何在分数一定的匹配文档计算。
通常,查询确定哪个文件匹配(二元判决),而相似性确定如何分数分配给匹配的文档。
域(Field)和文档(Document)
Document的得分由多个域的得分结果构成。需要注意的是假如两个文档内容相同,但是其中一个的内容在两个Field,一个在一个,他们的得分由于length normalization也会不一样
Score Boosting
Lucene的允许由“Boosting”在不同时期影响搜索结果:
- Index-time boost
Field.setBoost() 在文档加入到索引之前
- Query-time boost
Query.setBoost() 在查询的时候
5. 更改评分——相似度(Similarity)
- 索引时间
IndexWriterConfig.setSimilarity(Similarity) - 搜索时间
IndexSearcher.setSimilarity(Similarity)
也可以定义自己的Similarity,具体见这儿
6. Custom Query —— Expert Level
The Query Class
- createWeight(IndexSearch search, boolean)
- rewrite(IndexReader reader)
The Weight Interface
- getQuery()
- getValueForNormlization()
- normalize(float norm, float topLevalBoost)
- scorer()
- bulkScorer()
- explain(LeafReaderContext context, int doc)
The Scorer Class
- nextDoc() - 前进到匹配该查询,返回true当且仅当有另一个文件相匹配的下一个文档。
- docID() - 返回的匹配的文档ID
- score() - 返回当前文档的得分
- freq() - 返回当前文档匹配的数目
- advance() - 跳过前面的文件相匹配,其内径大于或等于价值传递文档。在许多情况下,预先可以更有效地不是简单地通过所有匹配的文档循环,直到目标文件被识别实现的。
getChiladren() - 返回子类
The BulkScorer Class
score(LeafCollection, int, int) - 分数的所有文件,但不包括指定的最大文件
7. 附录:搜索算法
这部分主要是指出通过评分过程,并作为前面内容的丰富。
在典型的搜索应用程序,一个Query被传递到IndexSearcher的,开始评分过程。
一旦IndexSearcher的里面,一个Collector 被用于的搜索结果的得分和排序。这些重要的对象中涉及的搜索:
- 查询的权重
- 调用的IndexSearcher
- 一个过滤器来限制结果集。请注意,该过滤器可以为null。
- 对象的排序方式,如果不希望在标准分数为基础的排序方法对结果进行排序。
假设我们不排序(排序但是不想不影响原始的Lucene分数),我们称之为的IndexSearcher的搜索方法之一,通过创建Weight在 IndexSearcher.createNormalizedWeight(query,boolearn), 过滤及数量结果我们想要的。该方法返回一个TopDocs对象,这是搜索结果的内部集合。该IndexSearcher的创建TopScoreDocCollector,并将它传递的权重,以筛选另一位专家搜索方法(更多的收集机制,见IndexSearcher的)。该TopScoreDocCollector使用的PriorityQueue来收集顶部结果搜索。
如果使用一个过滤器,一些初始设置后,以确定要包括哪些文档。否则,我们要求重的射手每个 的IndexReader段,并继续通过调用 BulkScorer.score(LeafCollector) 。
最后,我们实际上是要取得一些文件。评分方法采用的采集器(最有可能的TopScoreDocCollector或TopFieldCollector),并执行其business.Of当然,这里的情况变得涉足。该射手是由返回重量对象取决于什么类型的查询被提交。在具有多个查询词最现实世界的应用, 射手将是一个BooleanScorer2从创建BooleanWeight(参见上一节 的自定义查询有关更改此为信息)。
假定一个BooleanScorer2,我们首先初始化协调员,这是用于应用坐标因子。然后我们得到基于查询的需要,可选的,并且禁止份内部打分。利用这种内部的评分,在BooleanScorer2然后继续进入基础上,while循环 Scorer.nextDoc()方法。所述nextDoc()方法前进到下一个文档与查询匹配的。这是射手类的抽象方法,并因此被所有派生实现覆盖。如果你有一个简单的或查询您的内部射手是最有可能是DisjunctionSumScorer,基本上结合了从得分手的或运算方面的得分分。