Lucene(四)搜索

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

  1. SHOULD
  2. MUST
  3. 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

  1. createWeight(IndexSearch search, boolean)
  2. rewrite(IndexReader reader)

The Weight Interface

  1. getQuery()
  2. getValueForNormlization()
  3. normalize(float norm, float topLevalBoost)
  4. scorer()
  5. bulkScorer()
  6. explain(LeafReaderContext context, int doc)

The Scorer Class

  1. nextDoc() - 前进到匹配该查询,返回true当且仅当有另一个文件相匹配的下一个文档。
  2. docID() - 返回的匹配的文档ID
  3. score() - 返回当前文档的得分
  4. freq() - 返回当前文档匹配的数目
  5. advance() - 跳过前面的文件相匹配,其内径大于或等于价值传递文档。在许多情况下,预先可以更有效地不是简单地通过所有匹配的文档循环,直到目标文件被识别实现的。
  6. getChiladren() - 返回子类

    The BulkScorer Class

  7. score(LeafCollection, int, int) - 分数的所有文件,但不包括指定的最大文件

7. 附录:搜索算法

这部分主要是指出通过评分过程,并作为前面内容的丰富。

在典型的搜索应用程序,一个Query被传递到IndexSearcher的,开始评分过程。

一旦IndexSearcher的里面,一个Collector 被用于的搜索结果的得分和排序。这些重要的对象中涉及的搜索:

  1. 查询的权重
  2. 调用的IndexSearcher
  3. 一个过滤器来限制结果集。请注意,该过滤器可以为null。
  4. 对象的排序方式,如果不希望在标准分数为基础的排序方法对结果进行排序。
    假设我们不排序(排序但是不想不影响原始的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,基本上结合了从得分手的或运算方面的得分分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值